From 835f91e8f86364def30309708d4c69073f1a9ac5 Mon Sep 17 00:00:00 2001 From: Ivan Kluchnikov Date: Mon, 30 Apr 2012 18:00:36 +0400 Subject: [PATCH] We don't use OpenBTS bit vectors in PCU anymore. All OpenBTS bit vectors are replaced by Osmocom bit vectors. --- RLCMACTest.cpp | 90 +++++++---- csn1.cpp | 184 ++++++++++++----------- csn1.h | 8 +- gprs_rlcmac.cpp | 393 ++++++++++++++++++++++++------------------------ gprs_rlcmac.h | 8 +- gsm_rlcmac.cpp | 142 ++++++++--------- gsm_rlcmac.h | 12 +- pcu_l1_if.cpp | 27 ++-- pcu_l1_if.h | 4 +- 9 files changed, 450 insertions(+), 418 deletions(-) diff --git a/RLCMACTest.cpp b/RLCMACTest.cpp index cb929a4c..2b819b75 100644 --- a/RLCMACTest.cpp +++ b/RLCMACTest.cpp @@ -22,6 +22,7 @@ //#include #include #include +#include #include "csn1.h" #include "gsm_rlcmac.h" using namespace std; @@ -76,39 +77,52 @@ void printSizeofRLCMAC() void testRlcMacDownlink() { - BitVector resultVector(23*8); - resultVector.unhex("2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b"); + struct bitvec *resultVector = bitvec_alloc(23); + bitvec_unhex(resultVector, "2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b"); std::string testData[] = { "4e082500e3f1a81d080820800b2b2b2b2b2b2b2b2b2b2b", // Packet Downlink Assignment "48282407a6a074227201000b2b2b2b2b2b2b2b2b2b2b2b", // Packet Uplink Assignment "47240c00400000000000000079eb2ac9402b2b2b2b2b2b", // Packet Uplink Ack Nack "47283c367513ba333004242b2b2b2b2b2b2b2b2b2b2b2b" // Packet Uplink Assignment + "4913e00850884013a8048b2b2b2b2b2b2b2b2b2b2b2b2b" + "412430007fffffffffffffffefd19c7ba12b2b2b2b2b2b" + "41942b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b" }; int testDataSize = sizeof(testData)/sizeof(testData[0]); - BitVector vector[testDataSize]; - - unsigned char origin[23]; - unsigned char result[23]; cout << " DOWNLINK " << endl; for (int i = 0; i < testDataSize; i++) { - vector[i].resize(23*8); - vector[i].unhex(testData[i].c_str()); + bitvec *vector = bitvec_alloc(23); + 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)); cout << "=========Start DECODE===========" << endl; - decode_gsm_rlcmac_downlink(&vector[i], data); + decode_gsm_rlcmac_downlink(vector, data); cout << "+++++++++Finish DECODE++++++++++" << endl; cout << "=========Start ENCODE=============" << endl; - encode_gsm_rlcmac_downlink(&resultVector, data); + encode_gsm_rlcmac_downlink(resultVector, data); cout << "+++++++++Finish ENCODE+++++++++++" << endl; - cout << "vector1 = " << vector[i] << endl; - cout << "vector2 = " << resultVector << endl; - vector[i].pack(origin); - resultVector.pack(result); - if (memcmp(origin, result, 23) == 0) + cout << "vector1 = "; + for (int i = 0; i < 23; i++) + { + cout << (unsigned)*(vector->data + i); + } + 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; } @@ -116,7 +130,8 @@ void testRlcMacDownlink() { cout << "vector1 == vector2 : FALSE" << endl; } - resultVector.unhex("2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b"); + bitvec_unhex(resultVector, "2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b"); + bitvec_free(vector); free(data); } } @@ -124,38 +139,50 @@ void testRlcMacDownlink() void testRlcMacUplink() { - BitVector resultVector(23*8); - resultVector.unhex("2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b"); + struct bitvec *resultVector = bitvec_alloc(23); + bitvec_unhex(resultVector, "2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b"); std::string testData[] = { "400e1e61d11f2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b", // Packet Uplink Dummy Control Block "400b8020000000000000002480e00b2b2b2b2b2b2b2b2b", // Packet Downlink Ack/Nack "4016713dc094270ca2ae57ef909006aa0fc0001f80222b" // Packet Resource Request + "400a9020000000000000003010012a0800132b2b2b2b2b" }; int testDataSize = sizeof(testData)/sizeof(testData[0]); - BitVector vector[testDataSize]; - unsigned char origin[23]; - unsigned char result[23]; cout << " UPLINK " << endl; for (int i = 0; i < testDataSize; i++) { - vector[i].resize(23*8); - vector[i].unhex(testData[i].c_str()); + bitvec *vector = bitvec_alloc(23); + 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)); cout << "=========Start DECODE===========" << endl; - decode_gsm_rlcmac_uplink(&vector[i], data); + decode_gsm_rlcmac_uplink(vector, data); cout << "+++++++++Finish DECODE++++++++++" << endl; cout << "=========Start ENCODE=============" << endl; - encode_gsm_rlcmac_uplink(&resultVector, data); + encode_gsm_rlcmac_uplink(resultVector, data); cout << "+++++++++Finish ENCODE+++++++++++" << endl; - cout << "vector1 = " << vector[i] << endl; - cout << "vector2 = " << resultVector << endl; - vector[i].pack(origin); - resultVector.pack(result); - if (memcmp(origin, result, 23) == 0) + cout << "vector1 = "; + for (int i = 0; i < 23; i++) + { + cout << (unsigned)*(vector->data + i); + } + 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; } @@ -163,7 +190,8 @@ void testRlcMacUplink() { cout << "vector1 == vector2 : FALSE" << endl; } - resultVector.unhex("2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b"); + bitvec_unhex(resultVector, "2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b"); + bitvec_free(vector); free(data); } } diff --git a/csn1.cpp b/csn1.cpp index 0e34ec24..ddaa91d7 100644 --- a/csn1.cpp +++ b/csn1.cpp @@ -30,6 +30,8 @@ #include #include +#include +#include #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 */ 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}; //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; 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; result &= maskBits[no_of_bits]; } 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)); - 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)); result |= hight_part; } @@ -164,9 +166,9 @@ static const char* CSN_DESCR_type[]= */ 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; if (Tag == STANDARD_TAG) { @@ -177,7 +179,7 @@ existNextElement(BitVector *vector, size_t& readIndex, guint8 Tag) 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 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) { pui8 = pui8DATA(data, pDescr->offset); - *pui8 = vector->readField(readIndex, 1); + *pui8 = bitvec_read_field(vector, readIndex, 1); LOG(INFO) << pDescr->sz << " = " <<(unsigned)*pui8 << "\n"; /* 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) { - guint8 ui8 = vector->readField(readIndex, no_of_bits); + guint8 ui8 = bitvec_read_field(vector, readIndex, no_of_bits); pui8 = pui8DATA(data, pDescr->offset); *pui8 = ui8; LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n"; } 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 = ui16; LOG(INFO) << pDescr->sz << " = " << *pui16 << "\n";; } 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 = ui32; 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) { - guint8 ui8 = vector->readField(readIndex, no_of_bits); + guint8 ui8 = bitvec_read_field(vector, readIndex, no_of_bits); pui8 = pui8DATA(data, pDescr->offset); *pui8 = ui8 + (guint8)pDescr->descr.value; LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n"; } 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 = ui16 + (guint16)pDescr->descr.value; LOG(INFO) << pDescr->sz << " = " << *pui16 << "\n";; } 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 = ui32 + (guint16)pDescr->descr.value; 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); do { - *pui8 = vector->readField(readIndex, no_of_bits); + *pui8 = bitvec_read_field(vector, readIndex, no_of_bits); LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n"; pui8++; 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++) { - guint8 ui8 = vector->readField(readIndex, 8); + guint8 ui8 = bitvec_read_field(vector, readIndex, 8); pui8 = pui8DATA(data, pDescr->offset+ib); *pui8 = ui8; 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++) { - guint8 ui8 = vector->readField(readIndex, 8); + guint8 ui8 = bitvec_read_field(vector, readIndex, 8); pui8 = pui8DATA(data, pDescr->offset+ib); *pui8 = ui8; 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) { 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) { CSN_DESCR descr[2]; @@ -549,7 +551,7 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si csnStream_t arT = *ar; 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; bit_offset += 7; remaining_bits_len -= 7; @@ -600,7 +602,7 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si } else { - index |= vector->readField(readIndex, 1); + index |= bitvec_read_field(vector, readIndex, 1); } remaining_bits_len--; bit_offset++; @@ -623,7 +625,7 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si { pui8 = pui8DATA(data, pDescr->offset); *pui8 = 0x00; - if (vector->readField(readIndex, 1) > 0) + if (bitvec_read_field(vector, readIndex, 1) > 0) { *pui8 = 0x01; } @@ -649,21 +651,21 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si 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 = ui8; LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n"; } 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 = ui16; LOG(INFO) << pDescr->sz << " = " << *pui16 << "\n"; } 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 = ui32; 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) { - guint8 ui8 = vector->readField(readIndex, no_of_bits); + guint8 ui8 = bitvec_read_field(vector, readIndex, no_of_bits); pui8 = pui8DATA(data, pDescr->offset); *pui8 = ui8 + (guint8)pDescr->descr.value; LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n"; } 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 = ui16 + (guint16)pDescr->descr.value; LOG(INFO) << pDescr->sz << " = " << *pui16 << "\n"; } 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 = ui32 + (guint16)pDescr->descr.value; LOG(INFO) << pDescr->sz << " = " << *pui32 << "\n"; @@ -772,7 +774,7 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si 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"; pui8++; bit_offset += no_of_bits; @@ -785,7 +787,7 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si 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"; pui16++; 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) { - guint32 ui32 = vector->readField(readIndex, no_of_bits); + guint32 ui32 = bitvec_read_field(vector, readIndex, no_of_bits); pui32 = pui32DATA(data, pDescr->offset); *pui32 = ui32; LOG(INFO) << pDescr->sz << " = " << *pui32 << "\n"; } 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 = ui64; LOG(INFO) << pDescr->sz << " = " << *pui64 << "\n"; @@ -933,7 +935,7 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si } else { - fExist = vector->readField(readIndex, 1); + fExist = bitvec_read_field(vector, readIndex, 1); } *pui8 = fExist; @@ -978,7 +980,7 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si /* the "regular" M_NEXT_EXIST description element */ fExist = 0x00; - if (vector->readField(readIndex, 1)) + if (bitvec_read_field(vector, readIndex, 1)) { fExist = 0x01; } @@ -1071,7 +1073,7 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si if (nB1 > 0) { /* 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" ; pui8++; 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 */ while (no_of_bits > 0) { - *pui8 = vector->readField(readIndex, 8); + *pui8 = bitvec_read_field(vector, readIndex, 8); LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n" ; pui8++; no_of_bits -= 8; @@ -1126,14 +1128,14 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si while (no_of_bits > 0) { - *pui8 = vector->readField(readIndex, 8); + *pui8 = bitvec_read_field(vector, readIndex, 8); LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n" ; pui8++; no_of_bits -= 8; } if (nB1 > 0) { - *pui8 = vector->readField(readIndex, nB1); + *pui8 = bitvec_read_field(vector, readIndex, nB1); LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n" ; pui8++; no_of_bits -= nB1; @@ -1172,7 +1174,7 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si while (count > 0) { readIndex -= 8; - *pui8 = vector->readField(readIndex, 8); + *pui8 = bitvec_read_field(vector, readIndex, 8); LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n"; pui8++; bit_offset += 8; @@ -1205,7 +1207,7 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si remaining_bits_len--; /* 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"; pui8++; 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; } - 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 */ 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 */ bit_offset++; @@ -1352,7 +1354,7 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vector, si if (no_of_bits <= 32) { - ui32 = vector->readField(readIndex, no_of_bits); + ui32 = bitvec_read_field(vector, readIndex, no_of_bits); } 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 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) { pui8 = pui8DATA(data, pDescr->offset); - vector->writeField(writeIndex, *pui8, 1); + bitvec_write_field(vector, writeIndex, *pui8, 1); LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n"; /* 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) { 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"; } else if (no_of_bits <= 16) { 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"; } else if (no_of_bits <= 32) { 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"; } else @@ -1499,19 +1501,19 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec if (no_of_bits <= 8) { 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"; } else if (no_of_bits <= 16) { 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"; } else if (no_of_bits <= 32) { 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"; } else @@ -1540,12 +1542,12 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec if (no_of_bits <= 8) { 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() writeIndex -= no_of_bits; guint8 ui8 = get_masked_bits8(vector, writeIndex, bit_offset, 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"; } @@ -1583,7 +1585,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec pui8 = pui8DATA(data, pDescr->offset); do { - vector->writeField(writeIndex, *pui8, no_of_bits); + bitvec_write_field(vector, writeIndex, *pui8, no_of_bits); LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n"; pui8++; 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++) { 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"; } } @@ -1677,7 +1679,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec for(unsigned ib = 0; ib < 8; 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"; } } @@ -1732,7 +1734,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec guint8 no_of_bits = pChoice->bits; guint8 value = pChoice->value; 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]; gint16 Status; @@ -1777,7 +1779,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec csnStreamInit(&arT, bit_offset, remaining_bits_len); 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"; if (Status >= 0) @@ -1816,7 +1818,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec /* Assign UnionType */ pui8 = pui8DATA(data, pDescr->offset); //read index from data and write to vector - vector->writeField(writeIndex, *pui8, Bits); + bitvec_write_field(vector, writeIndex, *pui8, Bits); //decode index writeIndex -= Bits; @@ -1831,7 +1833,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec } else { - index |= vector->readField(writeIndex, 1); + index |= bitvec_read_field(vector, writeIndex, 1); } remaining_bits_len--; @@ -1840,7 +1842,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec } 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 */ @@ -1853,7 +1855,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec case CSN_BIT: { pui8 = pui8DATA(data, pDescr->offset); - vector->writeField(writeIndex, *pui8, 1); + bitvec_write_field(vector, writeIndex, *pui8, 1); LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n"; remaining_bits_len -= 1; bit_offset++; @@ -1877,19 +1879,19 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec if (no_of_bits <= 8) { 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"; } else if (no_of_bits <= 16) { 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"; } else if (no_of_bits <= 32) { 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"; } else @@ -1916,19 +1918,19 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec if (no_of_bits <= 8) { 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"; } else if (no_of_bits <= 16) { 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"; } else if (no_of_bits <= 32) { 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"; } else @@ -1957,12 +1959,12 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec if (no_of_bits <= 8) { 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() writeIndex -= no_of_bits; guint8 ui8 = get_masked_bits8(vector, writeIndex, bit_offset, 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"; } @@ -2000,7 +2002,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec pui8 = pui8DATA(data, pDescr->offset); do { - vector->writeField(writeIndex, *pui8, no_of_bits); + bitvec_write_field(vector, writeIndex, *pui8, no_of_bits); LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n"; pui8++; 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) { 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"; } else if (no_of_bits <= 64) { 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"; } else @@ -2146,7 +2148,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec unsigned exist = 0; pui8 = pui8DATA(data, pDescr->offset); exist = *pui8; - vector->writeField(writeIndex, *pui8, 1); + bitvec_write_field(vector, writeIndex, *pui8, 1); writeIndex--; if (CSN_EXIST_LH == pDescr->type) { @@ -2154,10 +2156,10 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec } else { - fExist = vector->readField(writeIndex, 1); + fExist = bitvec_read_field(vector, writeIndex, 1); } writeIndex--; - vector->writeField(writeIndex, fExist, 1); + bitvec_write_field(vector, writeIndex, fExist, 1); LOG(INFO) << pDescr->sz << " = " << (unsigned)fExist << "\n"; pDescr++; remaining_bits_len -= 1; @@ -2193,7 +2195,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec break; } - vector->writeField(writeIndex, *pui8, 1); + bitvec_write_field(vector, writeIndex, *pui8, 1); fExist = *pui8; LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n"; 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 */ - vector->writeField(writeIndex, *pui8, 1); + bitvec_write_field(vector, writeIndex, *pui8, 1); writeIndex--; fExist = get_masked_bits8(vector,writeIndex, bit_offset, 1); writeIndex--; - vector->writeField(writeIndex, fExist, 1); + bitvec_write_field(vector, writeIndex, fExist, 1); pui8++; remaining_bits_len -= 1; @@ -2286,7 +2288,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec if (nB1 > 0) { /* 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" ; pui8++; 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 */ while (no_of_bits > 0) { - vector->writeField(writeIndex, *pui8, 8); + bitvec_write_field(vector, writeIndex, *pui8, 8); LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n" ; pui8++; no_of_bits -= 8; @@ -2342,14 +2344,14 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec while (no_of_bits > 0) { - vector->writeField(writeIndex, *pui8, 8); + bitvec_write_field(vector, writeIndex, *pui8, 8); LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n" ; pui8++; no_of_bits -= 8; } if (nB1 > 0) { - vector->writeField(writeIndex, *pui8, nB1); + bitvec_write_field(vector, writeIndex, *pui8, nB1); LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n" ; pui8++; no_of_bits -= nB1; @@ -2388,7 +2390,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec while (count > 0) { - vector->writeField(writeIndex, *pui8, 8); + bitvec_write_field(vector, writeIndex, *pui8, 8); LOG(INFO) << pDescr->sz << " = " << (unsigned)*pui8 << "\n" ; pui8++; 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); while (ElementCount > 0) { /* 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" ; bit_offset++; remaining_bits_len--; /* 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" ; pui8++; 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; } - vector->writeField(writeIndex, !Tag, 1); + bitvec_write_field(vector, writeIndex, !Tag, 1); LOG(INFO) << pDescr->sz << " = " << (unsigned)(!Tag) << "\n" ; bit_offset++; @@ -2456,7 +2458,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec while (ElementCount > 0) { /* 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" ; 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" ; bit_offset++; @@ -2525,7 +2527,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec { /* get data element */ if (ElementCount != ElementNum) { - vector->writeField(writeIndex, Tag, 1); + bitvec_write_field(vector, writeIndex, Tag, 1); LOG(INFO) << pDescr->sz << " = " << (unsigned)Tag << "\n" ; bit_offset++; 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++; Tag = STANDARD_TAG; /* in case it was set to "reversed" */ pDescr++; @@ -2562,7 +2564,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, BitVector *vec case CSN_FIXED: { /* Verify the fixed bits */ 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"; remaining_bits_len -= no_of_bits; bit_offset += no_of_bits; diff --git a/csn1.h b/csn1.h index 5867fc4e..a50b6cd3 100644 --- a/csn1.h +++ b/csn1.h @@ -25,7 +25,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include +#include #include #include #ifndef _PACKET_CSN1_H_ @@ -82,7 +82,7 @@ typedef struct gint direction; /* 0 - decode; 1 - encode */ } 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 { 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 ******************************************************************************/ -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 */ #define CSN_DESCR_BEGIN(_STRUCT)\ diff --git a/gprs_rlcmac.cpp b/gprs_rlcmac.cpp index b78c27e7..81c5df25 100644 --- a/gprs_rlcmac.cpp +++ b/gprs_rlcmac.cpp @@ -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); } -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. unsigned wp = 0; - dest->writeField(wp,0x1,2); // Payload Type - dest->writeField(wp,0x0,2); // Uplink block with TDMA framenumber - dest->writeField(wp,0x1,1); // Suppl/Polling Bit - dest->writeField(wp,0x1,3); // Uplink state flag - dest->writeField(wp,0x2,6); // MESSAGE TYPE - dest->writeField(wp,0x0,2); // Page Mode + bitvec_write_field(dest, wp,0x1,2); // Payload Type + bitvec_write_field(dest, wp,0x0,2); // Uplink block with TDMA framenumber + bitvec_write_field(dest, wp,0x1,1); // Suppl/Polling Bit + bitvec_write_field(dest, wp,0x1,3); // Uplink state flag + bitvec_write_field(dest, wp,0x2,6); // MESSAGE TYPE + bitvec_write_field(dest, wp,0x0,2); // Page Mode - dest->writeField(wp,0x0,1); // switch PERSIST_LEVEL: off - dest->writeField(wp,0x2,2); // switch TLLI : on - dest->writeField(wp,tlli,32); // TLLI + bitvec_write_field(dest, wp,0x0,1); // switch PERSIST_LEVEL: off + bitvec_write_field(dest, wp,0x2,2); // switch TLLI : on + bitvec_write_field(dest, wp,tlli,32); // TLLI - dest->writeField(wp,0x0,1); // Message escape - dest->writeField(wp,0x0,2); // Medium Access Method: Dynamic Allocation - dest->writeField(wp,0x0,1); // RLC acknowledged mode + bitvec_write_field(dest, wp,0x0,1); // Message escape + bitvec_write_field(dest, wp,0x0,2); // Medium Access Method: Dynamic Allocation + 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 - dest->writeField(wp,0x1,8); // timeslot 7 - dest->writeField(wp,0x1,8); // TIMING_ADVANCE_INDEX + bitvec_write_field(dest, wp,0x0,1); // the network establishes no new downlink TBF for the mobile station + bitvec_write_field(dest, wp,0x1,8); // timeslot 7 + bitvec_write_field(dest, wp,0x1,8); // TIMING_ADVANCE_INDEX - dest->writeField(wp,0x0,1); // switch TIMING_ADVANCE_VALUE = off - dest->writeField(wp,0x1,1); // switch TIMING_ADVANCE_INDEX = on - dest->writeField(wp,0xC,4); // TIMING_ADVANCE_INDEX - dest->writeField(wp,0x7,3); // TIMING_ADVANCE_TIMESLOT_NUMBER + bitvec_write_field(dest, wp,0x0,1); // switch TIMING_ADVANCE_VALUE = off + bitvec_write_field(dest, wp,0x1,1); // switch TIMING_ADVANCE_INDEX = on + bitvec_write_field(dest, wp,0xC,4); // TIMING_ADVANCE_INDEX + bitvec_write_field(dest, wp,0x7,3); // TIMING_ADVANCE_TIMESLOT_NUMBER - dest->writeField(wp,0x0,1); // switch POWER CONTROL = off - dest->writeField(wp,0x1,1); // Frequency Parameters information elements = present + bitvec_write_field(dest, wp,0x0,1); // switch POWER CONTROL = off + bitvec_write_field(dest, wp,0x1,1); // Frequency Parameters information elements = present - dest->writeField(wp,0x2,3); // Training Sequence Code (TSC) = 2 - dest->writeField(wp,0x1,2); // Indirect encoding struct = present - dest->writeField(wp,0x0,6); // MAIO - dest->writeField(wp,0xE,4); // MA_Number - dest->writeField(wp,0x8,4); // CHANGE_MARK_1 CHANGE_MARK_2 + bitvec_write_field(dest, wp,0x2,3); // Training Sequence Code (TSC) = 2 + bitvec_write_field(dest, wp,0x1,2); // Indirect encoding struct = present + bitvec_write_field(dest, wp,0x0,6); // MAIO + bitvec_write_field(dest, wp,0xE,4); // MA_Number + bitvec_write_field(dest, wp,0x8,4); // CHANGE_MARK_1 CHANGE_MARK_2 - dest->writeField(wp,0x1,1); // switch TFI : on - dest->writeField(wp,tfi,5);// TFI + bitvec_write_field(dest, wp,0x1,1); // switch TFI : on + bitvec_write_field(dest, wp,tfi,5);// TFI - dest->writeField(wp,0x1,1); // Power Control Parameters IE = present - dest->writeField(wp,0x0,4); // ALPHA power control parameter - dest->writeField(wp,0x0,1); // switch GAMMA_TN0 = off - dest->writeField(wp,0x0,1); // switch GAMMA_TN1 = off - dest->writeField(wp,0x0,1); // switch GAMMA_TN2 = off - dest->writeField(wp,0x0,1); // switch GAMMA_TN3 = off - dest->writeField(wp,0x0,1); // switch GAMMA_TN4 = off - dest->writeField(wp,0x0,1); // switch GAMMA_TN5 = off - dest->writeField(wp,0x0,1); // switch GAMMA_TN6 = off - dest->writeField(wp,0x1,1); // switch GAMMA_TN7 = on - dest->writeField(wp,0x0,5); // GAMMA_TN7 + bitvec_write_field(dest, wp,0x1,1); // Power Control Parameters IE = present + bitvec_write_field(dest, wp,0x0,4); // ALPHA power control parameter + bitvec_write_field(dest, wp,0x0,1); // switch GAMMA_TN0 = off + bitvec_write_field(dest, wp,0x0,1); // switch GAMMA_TN1 = off + bitvec_write_field(dest, wp,0x0,1); // switch GAMMA_TN2 = off + bitvec_write_field(dest, wp,0x0,1); // switch GAMMA_TN3 = off + bitvec_write_field(dest, wp,0x0,1); // switch GAMMA_TN4 = off + bitvec_write_field(dest, wp,0x0,1); // switch GAMMA_TN5 = off + bitvec_write_field(dest, wp,0x0,1); // switch GAMMA_TN6 = off + bitvec_write_field(dest, wp,0x1,1); // switch GAMMA_TN7 = on + bitvec_write_field(dest, wp,0x0,5); // GAMMA_TN7 - dest->writeField(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); // TBF Starting TIME IE 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. unsigned wp = 0; - dest->writeField(wp,0x1,2); // Payload Type - dest->writeField(wp,0x0,2); // Uplink block with TDMA framenumber - dest->writeField(wp,0x1,1); // Suppl/Polling Bit - dest->writeField(wp,0x1,3); // Uplink state flag + bitvec_write_field(dest, wp,0x1,2); // Payload Type + bitvec_write_field(dest, wp,0x0,2); // Uplink block with TDMA framenumber + bitvec_write_field(dest, wp,0x1,1); // Suppl/Polling Bit + 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 - dest->writeField(wp,0x2,2); // switch TLLI : on - dest->writeField(wp,tlli,32); // TLLI + bitvec_write_field(dest, wp,0x0,1); // switch PERSIST_LEVEL: off + bitvec_write_field(dest, wp,0x2,2); // switch TLLI : on + bitvec_write_field(dest, wp,tlli,32); // TLLI - dest->writeField(wp,0x0,1); // Message escape - dest->writeField(wp,0x0,2); // CHANNEL_CODING_COMMAND - dest->writeField(wp,0x0,1); // TLLI_BLOCK_CHANNEL_CODING + bitvec_write_field(dest, wp,0x0,1); // Message escape + bitvec_write_field(dest, wp,0x0,2); // CHANNEL_CODING_COMMAND + bitvec_write_field(dest, wp,0x0,1); // TLLI_BLOCK_CHANNEL_CODING - dest->writeField(wp,0x1,1); // switch TIMING_ADVANCE_VALUE = on - dest->writeField(wp,0x0,6); // TIMING_ADVANCE_VALUE - dest->writeField(wp,0x0,1); // switch TIMING_ADVANCE_INDEX = off + bitvec_write_field(dest, wp,0x1,1); // switch TIMING_ADVANCE_VALUE = on + bitvec_write_field(dest, wp,0x0,6); // TIMING_ADVANCE_VALUE + 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 - dest->writeField(wp,0x0,1); // P0 = off + bitvec_write_field(dest, wp,0x0,1); // Dynamic Allocation + bitvec_write_field(dest, wp,0x0,1); // P0 = off - dest->writeField(wp,0x1,1); // USF_GRANULARITY - dest->writeField(wp,0x1,1); // switch TFI : on - dest->writeField(wp,tfi,5);// TFI + bitvec_write_field(dest, wp,0x1,1); // USF_GRANULARITY + bitvec_write_field(dest, wp,0x1,1); // switch TFI : on + bitvec_write_field(dest, wp,tfi,5);// TFI - dest->writeField(wp,0x0,1); // - dest->writeField(wp,0x0,1); // TBF Starting Time = off - dest->writeField(wp,0x0,1); // Timeslot Allocation + bitvec_write_field(dest, wp,0x0,1); // + bitvec_write_field(dest, wp,0x0,1); // TBF Starting Time = off + bitvec_write_field(dest, wp,0x0,1); // Timeslot Allocation - dest->writeField(wp,0x0,5); // USF_TN 0 - 4 - dest->writeField(wp,0x1,1); // USF_TN 5 - dest->writeField(wp,0x1,3); // USF_TN 5 - dest->writeField(wp,0x0,2); // USF_TN 6 - 7 -// dest->writeField(wp,0x0,1); // Measurement Mapping struct not present + bitvec_write_field(dest, wp,0x0,5); // USF_TN 0 - 4 + bitvec_write_field(dest, wp,0x1,1); // USF_TN 5 + bitvec_write_field(dest, wp,0x1,3); // USF_TN 5 + bitvec_write_field(dest, wp,0x0,2); // USF_TN 6 - 7 +// bitvec_write_field(dest, wp,0x0,1); // Measurement Mapping struct not present } // 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) { unsigned wp = 0; - dest->writeField(wp,0x0,4); // Skip Indicator - dest->writeField(wp,0x6,4); // Protocol Discriminator - dest->writeField(wp,0x3F,8); // Immediate Assignment Message Type + bitvec_write_field(dest, wp,0x0,4); // Skip Indicator + bitvec_write_field(dest, wp,0x6,4); // Protocol Discriminator + bitvec_write_field(dest, wp,0x3F,8); // Immediate Assignment Message Type // 10.5.2.25b Dedicated mode or TBF - dest->writeField(wp,0x0,1); // spare - dest->writeField(wp,0x0,1); // TMA : Two-message assignment: No meaning - dest->writeField(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,0x0,1); // spare + bitvec_write_field(dest, wp,0x0,1); // TMA : Two-message assignment: No meaning + bitvec_write_field(dest, wp,downlink,1); // Downlink : Downlink assignment to mobile in packet idle mode + 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 - dest->writeField(wp,0x1,5); // Channel type - dest->writeField(wp,(l1fh->fl1h)->channel_info.tn,3); // TN - dest->writeField(wp,(l1fh->fl1h)->channel_info.tsc,3); // TSC - dest->writeField(wp,0x0,3); // non-hopping RF channel configuraion - dest->writeField(wp,(l1fh->fl1h)->channel_info.arfcn,10); // ARFCN + bitvec_write_field(dest, wp,0x1,5); // Channel type + bitvec_write_field(dest, wp,(l1fh->fl1h)->channel_info.tn,3); // TN + bitvec_write_field(dest, wp,(l1fh->fl1h)->channel_info.tsc,3); // TSC + bitvec_write_field(dest, wp,0x0,3); // non-hopping RF channel configuraion + bitvec_write_field(dest, wp,(l1fh->fl1h)->channel_info.arfcn,10); // ARFCN //10.5.2.30 Request Reference - dest->writeField(wp,ra,8); // RA - dest->writeField(wp,(fn / (26 * 51)) % 32,5); // T1' - dest->writeField(wp,fn % 51,6); // T3 - dest->writeField(wp,fn % 26,5); // T2 + bitvec_write_field(dest, wp,ra,8); // RA + bitvec_write_field(dest, wp,(fn / (26 * 51)) % 32,5); // T1' + bitvec_write_field(dest, wp,fn % 51,6); // T3 + bitvec_write_field(dest, wp,fn % 26,5); // T2 // 10.5.2.40 Timing Advance - dest->writeField(wp,0x0,2); // spare - dest->writeField(wp,ta,6); // Timing Advance value + bitvec_write_field(dest, wp,0x0,2); // spare + bitvec_write_field(dest, wp,ta,6); // Timing Advance value // No mobile allocation in non-hopping systems. // A zero-length LV. Just write L=0. - dest->writeField(wp,0,8); + bitvec_write_field(dest, wp,0,8); if (downlink) { // GSM 04.08 10.5.2.16 IA Rest Octets - dest->writeField(wp, 3, 2); // "HH" - dest->writeField(wp, 1, 2); // "01" Packet Downlink Assignment - dest->writeField(wp,tlli,32); // TLLI - dest->writeField(wp,0x1,1); // switch TFI : on - dest->writeField(wp,tfi,5); // TFI - dest->writeField(wp,0x0,1); // RLC acknowledged mode - dest->writeField(wp,0x0,1); // ALPHA = present - dest->writeField(wp,0x0,5); // GAMMA power control parameter - dest->writeField(wp,0x0,1); // Polling Bit - dest->writeField(wp,0x1,1); // TA_VALID ??? - dest->writeField(wp,0x1,1); // switch TIMING_ADVANCE_INDEX = on - dest->writeField(wp,0x0,4); // TIMING_ADVANCE_INDEX - dest->writeField(wp,0x0,1); // TBF Starting TIME present - dest->writeField(wp,0x0,1); // P0 not present - dest->writeField(wp,0x1,1); // P0 not present - dest->writeField(wp,0xb,4); + bitvec_write_field(dest, wp, 3, 2); // "HH" + bitvec_write_field(dest, wp, 1, 2); // "01" Packet Downlink Assignment + bitvec_write_field(dest, wp,tlli,32); // TLLI + bitvec_write_field(dest, wp,0x1,1); // switch TFI : on + bitvec_write_field(dest, wp,tfi,5); // TFI + bitvec_write_field(dest, wp,0x0,1); // RLC acknowledged mode + bitvec_write_field(dest, wp,0x0,1); // ALPHA = present + bitvec_write_field(dest, wp,0x0,5); // GAMMA power control parameter + bitvec_write_field(dest, wp,0x0,1); // Polling Bit + bitvec_write_field(dest, wp,0x1,1); // TA_VALID ??? + bitvec_write_field(dest, wp,0x1,1); // switch TIMING_ADVANCE_INDEX = on + bitvec_write_field(dest, wp,0x0,4); // TIMING_ADVANCE_INDEX + bitvec_write_field(dest, wp,0x0,1); // TBF Starting TIME present + bitvec_write_field(dest, wp,0x0,1); // P0 not present + bitvec_write_field(dest, wp,0x1,1); // P0 not present + bitvec_write_field(dest, wp,0xb,4); } else { // GMS 04.08 10.5.2.37b 10.5.2.16 - dest->writeField(wp, 3, 2); // "HH" - dest->writeField(wp, 0, 2); // "0" Packet Uplink Assignment - dest->writeField(wp, 1, 1); // Block Allocation : Not Single Block Allocation - dest->writeField(wp, tfi, 5); // TFI_ASSIGNMENT Temporary Flow Identity - dest->writeField(wp, 0, 1); // POLLING - dest->writeField(wp, 0, 1); // ALLOCATION_TYPE: dynamic - dest->writeField(wp, 1, 3); // USF - dest->writeField(wp, 1, 1); // USF_GRANULARITY - dest->writeField(wp, 0 , 1); // "0" power control: Not Present - dest->writeField(wp, 0, 2); // CHANNEL_CODING_COMMAND - dest->writeField(wp, 1, 1); // TLLI_BLOCK_CHANNEL_CODING - dest->writeField(wp, 1 , 1); // "1" Alpha : Present - dest->writeField(wp, 0, 4); // Alpha - dest->writeField(wp, 0, 5); // Gamma - dest->writeField(wp, 0, 1); // TIMING_ADVANCE_INDEX_FLAG - dest->writeField(wp, 0, 1); // TBF_STARTING_TIME_FLAG + bitvec_write_field(dest, wp, 3, 2); // "HH" + bitvec_write_field(dest, wp, 0, 2); // "0" Packet Uplink Assignment + bitvec_write_field(dest, wp, 1, 1); // Block Allocation : Not Single Block Allocation + bitvec_write_field(dest, wp, tfi, 5); // TFI_ASSIGNMENT Temporary Flow Identity + bitvec_write_field(dest, wp, 0, 1); // POLLING + bitvec_write_field(dest, wp, 0, 1); // ALLOCATION_TYPE: dynamic + bitvec_write_field(dest, wp, 1, 3); // USF + bitvec_write_field(dest, wp, 1, 1); // USF_GRANULARITY + bitvec_write_field(dest, wp, 0 , 1); // "0" power control: Not Present + bitvec_write_field(dest, wp, 0, 2); // CHANNEL_CODING_COMMAND + bitvec_write_field(dest, wp, 1, 1); // TLLI_BLOCK_CHANNEL_CODING + bitvec_write_field(dest, wp, 1 , 1); // "1" Alpha : Present + bitvec_write_field(dest, wp, 0, 4); // Alpha + bitvec_write_field(dest, wp, 0, 5); // Gamma + bitvec_write_field(dest, wp, 0, 1); // TIMING_ADVANCE_INDEX_FLAG + bitvec_write_field(dest, wp, 0, 1); // TBF_STARTING_TIME_FLAG } 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 unsigned wp = 0; - dest->writeField(wp, 3, 2); // "HH" - dest->writeField(wp, 1, 2); // "01" Packet Downlink Assignment - dest->writeField(wp,tlli,32); // TLLI - dest->writeField(wp,0x1,1); // switch TFI : on - dest->writeField(wp,tfi,5); // TFI - dest->writeField(wp,0x0,1); // RLC acknowledged mode - dest->writeField(wp,0x0,1); // ALPHA = present - dest->writeField(wp,0x0,5); // GAMMA power control parameter - dest->writeField(wp,0x0,1); // Polling Bit - dest->writeField(wp,0x1,1); // TA_VALID ??? - dest->writeField(wp,0x1,1); // switch TIMING_ADVANCE_INDEX = on - dest->writeField(wp,0x0,4); // TIMING_ADVANCE_INDEX - dest->writeField(wp,0x0,1); // TBF Starting TIME present - dest->writeField(wp,0x0,1); // P0 not present - dest->writeField(wp,0x1,1); // P0 not present - dest->writeField(wp,0xb,4); + bitvec_write_field(dest, wp, 3, 2); // "HH" + bitvec_write_field(dest, wp, 1, 2); // "01" Packet Downlink Assignment + bitvec_write_field(dest, wp,tlli,32); // TLLI + bitvec_write_field(dest, wp,0x1,1); // switch TFI : on + bitvec_write_field(dest, wp,tfi,5); // TFI + bitvec_write_field(dest, wp,0x0,1); // RLC acknowledged mode + bitvec_write_field(dest, wp,0x0,1); // ALPHA = present + bitvec_write_field(dest, wp,0x0,5); // GAMMA power control parameter + bitvec_write_field(dest, wp,0x0,1); // Polling Bit + bitvec_write_field(dest, wp,0x1,1); // TA_VALID ??? + bitvec_write_field(dest, wp,0x1,1); // switch TIMING_ADVANCE_INDEX = on + bitvec_write_field(dest, wp,0x0,4); // TIMING_ADVANCE_INDEX + bitvec_write_field(dest, wp,0x0,1); // TBF Starting TIME present + bitvec_write_field(dest, wp,0x0,1); // P0 not present + bitvec_write_field(dest, wp,0x1,1); // P0 not present + 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. unsigned wp = 0; - dest->writeField(wp,0x1,2); // payload - dest->writeField(wp,0x0,2); // Uplink block with TDMA framenumber - if (cv == 0) dest->writeField(wp,0x1,1); // Suppl/Polling Bit - else dest->writeField(wp,0x0,1); //Suppl/Polling Bit - dest->writeField(wp,0x1,3); // Uplink state flag + bitvec_write_field(dest, wp,0x1,2); // payload + bitvec_write_field(dest, wp,0x0,2); // Uplink block with TDMA framenumber + if (cv == 0) bitvec_write_field(dest, wp,0x1,1); // Suppl/Polling Bit + else bitvec_write_field(dest, wp,0x0,1); //Suppl/Polling Bit + bitvec_write_field(dest, wp,0x1,3); // Uplink state flag - //dest->writeField(wp,0x0,1); // Reduced block sequence number - //dest->writeField(wp,BSN+6,5); // Radio transaction identifier - //dest->writeField(wp,0x1,1); // Final segment - //dest->writeField(wp,0x1,1); // Address control + //bitvec_write_field(dest, wp,0x0,1); // Reduced block sequence number + //bitvec_write_field(dest, wp,BSN+6,5); // Radio transaction identifier + //bitvec_write_field(dest, wp,0x1,1); // Final segment + //bitvec_write_field(dest, wp,0x1,1); // Address control - //dest->writeField(wp,0x0,2); // Power reduction: 0 - //dest->writeField(wp,TFI,5); // Temporary flow identifier - //dest->writeField(wp,0x1,1); // Direction + //bitvec_write_field(dest, wp,0x0,2); // Power reduction: 0 + //bitvec_write_field(dest, wp,TFI,5); // Temporary flow identifier + //bitvec_write_field(dest, wp,0x1,1); // Direction - dest->writeField(wp,0x09,6); // MESSAGE TYPE - dest->writeField(wp,0x0,2); // Page Mode + bitvec_write_field(dest, wp,0x09,6); // MESSAGE TYPE + bitvec_write_field(dest, wp,0x0,2); // Page Mode - dest->writeField(wp,0x0,2); - dest->writeField(wp,tfi,5); // Uplink TFI - dest->writeField(wp,0x0,1); + bitvec_write_field(dest, wp,0x0,2); + bitvec_write_field(dest, wp,tfi,5); // Uplink TFI + bitvec_write_field(dest, wp,0x0,1); - dest->writeField(wp,0x0,2); // CS1 - if (cv == 0) dest->writeField(wp,0x1,1); // FINAL_ACK_INDICATION - else dest->writeField(wp,0x0,1); // FINAL_ACK_INDICATION - dest->writeField(wp,bsn + 1,7); // STARTING_SEQUENCE_NUMBER + bitvec_write_field(dest, wp,0x0,2); // CS1 + if (cv == 0) bitvec_write_field(dest, wp,0x1,1); // FINAL_ACK_INDICATION + else bitvec_write_field(dest, wp,0x0,1); // FINAL_ACK_INDICATION + bitvec_write_field(dest, wp,bsn + 1,7); // STARTING_SEQUENCE_NUMBER // RECEIVE_BLOCK_BITMAP 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 - dest->writeField(wp,tlli,8*4); - dest->writeField(wp,0x00,4); //spare + bitvec_write_field(dest, wp,0x1,1); // CONTENTION_RESOLUTION_TLLI = present + bitvec_write_field(dest, wp,tlli,8*4); + 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) { - BitVector packet_uplink_ack_vec(23*8); - packet_uplink_ack_vec.unhex("2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b"); - write_packet_uplink_ack(&packet_uplink_ack_vec, tfi, tlli, ul_data_block->CV, ul_data_block->BSN); + bitvec *packet_uplink_ack_vec = bitvec_alloc(23); + 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); COUT("RLCMAC_CONTROL_BLOCK>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); 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); 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) @@ -451,7 +452,7 @@ void gprs_rlcmac_data_block_parse(gprs_rlcmac_tbf* tbf, RlcMacUplinkDataBlock_t } /* 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; @@ -503,7 +504,7 @@ int gprs_rlcmac_rcv_data_block(BitVector *rlc_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; uint8_t tfi = 0; @@ -532,20 +533,21 @@ int gprs_rlcmac_rcv_control_block(BitVector *rlc_block) return 0; } COUT("SEND PacketUplinkAssignment>>>>>>>>>>>>>>>>>>"); - BitVector packet_uplink_assignment(23*8); - packet_uplink_assignment.unhex("2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b"); - write_packet_uplink_assignment(&packet_uplink_assignment, tbf->tfi, tbf->tlli); - pcu_l1if_tx(&packet_uplink_assignment, GsmL1_Sapi_Pacch); + bitvec *packet_uplink_assignment = bitvec_alloc(23); + bitvec_unhex(packet_uplink_assignment, "2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b"); + write_packet_uplink_assignment(packet_uplink_assignment, tbf->tfi, tbf->tlli); + pcu_l1if_tx(packet_uplink_assignment, GsmL1_Sapi_Pacch); + bitvec_free(packet_uplink_assignment); break; } free(ul_control_block); return 1; } -void gprs_rlcmac_rcv_block(BitVector *rlc_block) +void gprs_rlcmac_rcv_block(bitvec *rlc_block) { unsigned readIndex = 0; - unsigned payload = rlc_block->readField(readIndex, 2); + unsigned payload = bitvec_read_field(rlc_block, readIndex, 2); switch (payload) { 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("SEND Immidiate Assignment>>>>>>>>>>>>>>>>>>"); - BitVector immediate_assignment(23*8); - immediate_assignment.unhex("2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b"); - int len = write_immediate_assignment(&immediate_assignment, 0, ra, Fn, ta, tbf->tfi); - pcu_l1if_tx(&immediate_assignment, GsmL1_Sapi_Agch, len); + bitvec *immediate_assignment = bitvec_alloc(23); + bitvec_unhex(immediate_assignment, "2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b"); + int len = write_immediate_assignment(immediate_assignment, 0, ra, Fn, ta, tbf->tfi); + pcu_l1if_tx(immediate_assignment, GsmL1_Sapi_Agch, len); + bitvec_free(immediate_assignment); } // 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) { int spare_len = 0; - BitVector data_block_vector(BLOCK_LEN*8); - data_block_vector.unhex("2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b"); + bitvec *data_block_vector = bitvec_alloc(BLOCK_LEN); + bitvec_unhex(data_block_vector, "2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b"); RlcMacDownlinkDataBlock_t * data_block = (RlcMacDownlinkDataBlock_t *)malloc(sizeof(RlcMacDownlinkDataBlock_t)); data_block->PAYLOAD_TYPE = 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++) { 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); - 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) @@ -686,9 +690,10 @@ void gprs_rlcmac_tx_ul_ud(gprs_rlcmac_tbf *tbf) void gprs_rlcmac_downlink_assignment(gprs_rlcmac_tbf *tbf) { COUT("SEND IA Rest Octets Downlink Assignment>>>>>>>>>>>>>>>>>>"); - BitVector immediate_assignment(23*8); - immediate_assignment.unhex("2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b"); - 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); + bitvec *immediate_assignment = bitvec_alloc(23); + 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); + pcu_l1if_tx(immediate_assignment, GsmL1_Sapi_Agch, len); + bitvec_free(immediate_assignment); tbf_gsm_timer_start(tbf, 0, 120); } diff --git a/gprs_rlcmac.h b/gprs_rlcmac.h index b5103951..f38069c0 100644 --- a/gprs_rlcmac.h +++ b/gprs_rlcmac.h @@ -20,7 +20,7 @@ #ifndef GPRS_RLCMAC_H #define GPRS_RLCMAC_H -#include +#include #include #include @@ -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); -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); diff --git a/gsm_rlcmac.cpp b/gsm_rlcmac.cpp index 32694fe3..995ca2b1 100644 --- a/gsm_rlcmac.cpp +++ b/gsm_rlcmac.cpp @@ -714,7 +714,7 @@ CSN_DESCR_BEGIN(Receive_N_PDU_Number_t) M_UINT (Receive_N_PDU_Number_t, value, 8), 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) { @@ -825,7 +825,7 @@ CSN_DESCR_BEGIN (Content_t) M_UINT (Content_t, PS_HandoverCapability, 1), 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) { @@ -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), 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) { @@ -4716,11 +4716,11 @@ CSN_DESCR_BEGIN (SI6_RestOctet_t) M_UINT_LH (SI6_RestOctet_t, BandIndicator, 1), 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; 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) { @@ -4735,7 +4735,7 @@ void decode_gsm_rlcmac_uplink(BitVector * vector, RlcMacUplink_t * data) data->NrOfBits = (23 - 1) * 8; csnStreamInit(&ar, 0, data->NrOfBits); readIndex += 6; - data->u.MESSAGE_TYPE = vector->readField(readIndex, 6); + data->u.MESSAGE_TYPE = bitvec_read_field(vector, readIndex, 6); readIndex = 0; 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; /* See RLC/MAC downlink control block structure in TS 44.060 / 10.3.1 */ gint bit_offset = 0; gint bit_length; size_t readIndex = 0; - data->PAYLOAD_TYPE = vector->readField(readIndex, 2); - data->RRBP = vector->readField(readIndex, 2); - data->SP = vector->readField(readIndex, 1); - data->USF = vector->readField(readIndex, 3); + data->PAYLOAD_TYPE = bitvec_read_field(vector, readIndex, 2); + data->RRBP = bitvec_read_field(vector, readIndex, 2); + data->SP = bitvec_read_field(vector, readIndex, 1); + data->USF = bitvec_read_field(vector, readIndex, 3); if (data->PAYLOAD_TYPE == PAYLOAD_TYPE_DATA) { @@ -4850,27 +4850,27 @@ void decode_gsm_rlcmac_downlink(BitVector * vector, RlcMacDownlink_t * data) bit_offset = 8; if (data->PAYLOAD_TYPE == PAYLOAD_TYPE_CTRL_OPT_OCTET) { - data->RBSN = vector->readField(readIndex, 1); - data->RTI = vector->readField(readIndex, 5); - data->FS = vector->readField(readIndex, 1); - data->AC = vector->readField(readIndex, 1); + data->RBSN = bitvec_read_field(vector, readIndex, 1); + data->RTI = bitvec_read_field(vector, readIndex, 5); + data->FS = bitvec_read_field(vector, readIndex, 1); + data->AC = bitvec_read_field(vector, readIndex, 1); bit_offset += 8; if (data->AC == 1) { - data->PR = vector->readField(readIndex, 2); - data->TFI = vector->readField(readIndex, 5); - data->D = vector->readField(readIndex, 1); + data->PR = bitvec_read_field(vector, readIndex, 2); + data->TFI = bitvec_read_field(vector, readIndex, 5); + data->D = bitvec_read_field(vector, readIndex, 1); bit_offset += 8; } if ((data->RBSN == 1) && (data->FS == 0)) { - data->RBSNe = vector->readField(readIndex, 3); - data->FSe = vector->readField(readIndex, 1); - data->spare = vector->readField(readIndex, 4); + data->RBSNe = bitvec_read_field(vector, readIndex, 3); + data->FSe = bitvec_read_field(vector, readIndex, 1); + data->spare = bitvec_read_field(vector, readIndex, 4); bit_offset += 8; } } - data->u.MESSAGE_TYPE = vector->readField(readIndex, 6); + data->u.MESSAGE_TYPE = bitvec_read_field(vector, readIndex, 6); } /* 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; 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; @@ -5127,30 +5127,30 @@ void encode_gsm_rlcmac_downlink(BitVector * vector, RlcMacDownlink_t * data) else { /* First print the message type and create a tree item */ - vector->writeField(writeIndex, data->PAYLOAD_TYPE, 2); - vector->writeField(writeIndex, data->RRBP, 2); - vector->writeField(writeIndex, data->SP, 1); - vector->writeField(writeIndex, data->USF, 3); + bitvec_write_field(vector, writeIndex, data->PAYLOAD_TYPE, 2); + bitvec_write_field(vector, writeIndex, data->RRBP, 2); + bitvec_write_field(vector, writeIndex, data->SP, 1); + bitvec_write_field(vector, writeIndex, data->USF, 3); bit_offset = 8; if (data->PAYLOAD_TYPE == PAYLOAD_TYPE_CTRL_OPT_OCTET) { - vector->writeField(writeIndex, data->RBSN, 1); - vector->writeField(writeIndex, data->RTI, 5); - vector->writeField(writeIndex, data->FS, 1); - vector->writeField(writeIndex, data->AC, 1); + bitvec_write_field(vector, writeIndex, data->RBSN, 1); + bitvec_write_field(vector, writeIndex, data->RTI, 5); + bitvec_write_field(vector, writeIndex, data->FS, 1); + bitvec_write_field(vector, writeIndex, data->AC, 1); bit_offset += 8; if (data->AC == 1) { - vector->writeField(writeIndex, data->PR, 2); - vector->writeField(writeIndex, data->TFI, 5); - vector->writeField(writeIndex, data->D, 1); + bitvec_write_field(vector, writeIndex, data->PR, 2); + bitvec_write_field(vector, writeIndex, data->TFI, 5); + bitvec_write_field(vector, writeIndex, data->D, 1); bit_offset += 8; } if ((data->RBSN == 1) && (data->FS == 0)) { - vector->writeField(writeIndex, data->RBSNe, 3); - vector->writeField(writeIndex, data->FSe, 1); - vector->writeField(writeIndex, data->spare, 4); + bitvec_write_field(vector, writeIndex, data->RBSNe, 3); + bitvec_write_field(vector, writeIndex, data->FSe, 1); + bitvec_write_field(vector, writeIndex, data->spare, 4); 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; //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) { readIndex = 0; // MAC header - data->PAYLOAD_TYPE = vector->readField(readIndex, 2); - data->CV = vector->readField(readIndex, 4); - data->SI = vector->readField(readIndex, 1); - data->R = vector->readField(readIndex, 1); + data->PAYLOAD_TYPE = bitvec_read_field(vector, readIndex, 2); + data->CV = bitvec_read_field(vector, readIndex, 4); + data->SI = bitvec_read_field(vector, readIndex, 1); + data->R = bitvec_read_field(vector, readIndex, 1); LOG(INFO) << " PAYLOAD_TYPE = " << (unsigned)(data->PAYLOAD_TYPE); LOG(INFO) << " CV = " << (unsigned)(data->CV); LOG(INFO) << " SI = " << (unsigned)(data->SI); LOG(INFO) << " R = " << (unsigned)(data->R); // Octet 1 - data->spare = vector->readField(readIndex, 1); - data->PI = vector->readField(readIndex, 1); - data->TFI = vector->readField(readIndex, 5); - data->TI = vector->readField(readIndex, 1); + data->spare = bitvec_read_field(vector, readIndex, 1); + data->PI = bitvec_read_field(vector, readIndex, 1); + data->TFI = bitvec_read_field(vector, readIndex, 5); + data->TI = bitvec_read_field(vector, readIndex, 1); LOG(INFO) << " spare = " << (unsigned)(data->spare); LOG(INFO) << " PI = " << (unsigned)(data->PI); LOG(INFO) << " TFI = " << (unsigned)(data->TFI); LOG(INFO) << " TI = " << (unsigned)(data->TI); // Octet 2 - data->BSN = vector->readField(readIndex, 7); - data->E_1 = vector->readField(readIndex, 1); + data->BSN = bitvec_read_field(vector, readIndex, 7); + data->E_1 = bitvec_read_field(vector, readIndex, 1); LOG(INFO) << " BSN = " << (unsigned)(data->BSN); 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; do { - data->LENGTH_INDICATOR[i] = vector->readField(readIndex, 6); - data->M[i] = vector->readField(readIndex, 1); - data->E[i] = vector->readField(readIndex, 1); + data->LENGTH_INDICATOR[i] = bitvec_read_field(vector, readIndex, 6); + data->M[i] = bitvec_read_field(vector, readIndex, 1); + data->E[i] = bitvec_read_field(vector, readIndex, 1); LOG(INFO) << " LENGTH_INDICATOR[" << i << "] = " << (unsigned)(data->LENGTH_INDICATOR[i]); LOG(INFO) << " M[" << i << "] = " << (unsigned)(data->M[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 { - data->TLLI = vector->readField(readIndex, 32); + data->TLLI = bitvec_read_field(vector, readIndex, 32); LOG(INFO) << " TLLI = " << data->TLLI; if (data->PI == 1) // PFI is present if TI field indicates presence of TLLI { - data->PFI = vector->readField(readIndex, 7); - data->E_2 = vector->readField(readIndex, 1); + data->PFI = bitvec_read_field(vector, readIndex, 7); + data->E_2 = bitvec_read_field(vector, readIndex, 1); LOG(INFO) << " PFI = " << (unsigned)(data->PFI); 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; 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) << "\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; if (data->PAYLOAD_TYPE == PAYLOAD_TYPE_DATA) { // MAC header - vector->writeField(writeIndex, data->PAYLOAD_TYPE, 2); - vector->writeField(writeIndex, data->RRBP, 2); - vector->writeField(writeIndex, data->SP, 1); - vector->writeField(writeIndex, data->USF, 3); + bitvec_write_field(vector, writeIndex, data->PAYLOAD_TYPE, 2); + bitvec_write_field(vector, writeIndex, data->RRBP, 2); + bitvec_write_field(vector, writeIndex, data->SP, 1); + bitvec_write_field(vector, writeIndex, data->USF, 3); LOG(INFO) << " PAYLOAD_TYPE = " << (unsigned)(data->PAYLOAD_TYPE); LOG(INFO) << " RRBP = " << (unsigned)(data->RRBP); LOG(INFO) << " SP = " << (unsigned)(data->SP); LOG(INFO) << " USF = " << (unsigned)(data->USF); // Octet 1 - vector->writeField(writeIndex, data->PR, 2); - vector->writeField(writeIndex, data->TFI, 5); - vector->writeField(writeIndex, data->FBI, 1); + bitvec_write_field(vector, writeIndex, data->PR, 2); + bitvec_write_field(vector, writeIndex, data->TFI, 5); + bitvec_write_field(vector, writeIndex, data->FBI, 1); LOG(INFO) << " PR = " << (unsigned)(data->PR); LOG(INFO) << " TFI = " << (unsigned)(data->TFI); LOG(INFO) << " FBI = " << (unsigned)(data->FBI); // Octet 2 - vector->writeField(writeIndex, data->BSN, 7); - vector->writeField(writeIndex, data->E_1, 1); + bitvec_write_field(vector, writeIndex, data->BSN, 7); + bitvec_write_field(vector, writeIndex, data->E_1, 1); LOG(INFO) << " BSN = " << (unsigned)(data->BSN); LOG(INFO) << " E_1 = " << (unsigned)(data->E_1); // Octet 3 (optional) @@ -5403,9 +5403,9 @@ void encode_gsm_rlcmac_downlink_data(BitVector * vector, RlcMacDownlinkDataBlock unsigned i = 0; do { - vector->writeField(writeIndex, data->LENGTH_INDICATOR[i], 6); - vector->writeField(writeIndex, data->M[i], 1); - vector->writeField(writeIndex, data->E[i], 1); + bitvec_write_field(vector, writeIndex, data->LENGTH_INDICATOR[i], 6); + bitvec_write_field(vector, writeIndex, data->M[i], 1); + bitvec_write_field(vector, writeIndex, data->E[i], 1); LOG(INFO) << " LENGTH_INDICATOR[" << i << "] = " << (unsigned)(data->LENGTH_INDICATOR[i]); LOG(INFO) << " M[" << i << "] = " << (unsigned)(data->M[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; 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]); } } diff --git a/gsm_rlcmac.h b/gsm_rlcmac.h index 516cab51..afec1468 100644 --- a/gsm_rlcmac.h +++ b/gsm_rlcmac.h @@ -5121,10 +5121,10 @@ typedef struct } EnhancedMeasurementReport_t; - void decode_gsm_rlcmac_uplink(BitVector * vector, RlcMacUplink_t * data); - void decode_gsm_rlcmac_downlink(BitVector * vector, RlcMacDownlink_t * data); - void encode_gsm_rlcmac_downlink(BitVector * vector, RlcMacDownlink_t * data); - void encode_gsm_rlcmac_uplink(BitVector * vector, RlcMacUplink_t * data); - void decode_gsm_rlcmac_uplink_data(BitVector * vector, RlcMacUplinkDataBlock_t * data); - void encode_gsm_rlcmac_downlink_data(BitVector * vector, RlcMacDownlinkDataBlock_t * data); + void decode_gsm_rlcmac_uplink(bitvec * vector, RlcMacUplink_t * data); + void decode_gsm_rlcmac_downlink(bitvec * vector, RlcMacDownlink_t * data); + void encode_gsm_rlcmac_downlink(bitvec * vector, RlcMacDownlink_t * data); + void encode_gsm_rlcmac_uplink(bitvec * vector, RlcMacUplink_t * data); + void decode_gsm_rlcmac_uplink_data(bitvec * vector, RlcMacUplinkDataBlock_t * data); + void encode_gsm_rlcmac_downlink_data(bitvec * vector, RlcMacDownlinkDataBlock_t * data); #endif /* __PACKET_GSM_RLCMAC_H__ */ diff --git a/pcu_l1_if.cpp b/pcu_l1_if.cpp index be2cda01..4aa97073 100644 --- a/pcu_l1_if.cpp +++ b/pcu_l1_if.cpp @@ -53,23 +53,22 @@ struct msgb *l1p_msgb_alloc(void) struct msgb *gen_dummy_msg(void) { - int ofs = 0; struct msgb *msg = l1p_msgb_alloc(); GsmL1_Prim_t *prim = msgb_l1prim(msg); // RLC/MAC filler with USF=1 - BitVector filler("0100000110010100001010110010101100101011001010110010101100101011001010110010101100101011001010110010101100101011001010110010101100101011001010110010101100101011001010110010101100101011"); + bitvec *filler = bitvec_alloc(23); + bitvec_unhex(filler, "41942b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b"); prim->id = GsmL1_PrimId_PhDataReq; prim->u.phDataReq.sapi = GsmL1_Sapi_Pacch; - filler.pack((unsigned char*)&(prim->u.phDataReq.msgUnitParam.u8Buffer[ofs])); - ofs += filler.size() >> 3; - prim->u.phDataReq.msgUnitParam.u8Size = ofs; + bitvec_pack(filler, prim->u.phDataReq.msgUnitParam.u8Buffer); + prim->u.phDataReq.msgUnitParam.u8Size = filler->data_len; + bitvec_free(filler); return msg; } // 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 osmo_wqueue * queue; 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->u.phDataReq.sapi = sapi; - block->pack((unsigned char*)&(prim->u.phDataReq.msgUnitParam.u8Buffer[ofs])); - ofs += block->size() >> 3; + bitvec_pack(block, prim->u.phDataReq.msgUnitParam.u8Buffer); 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); } int pcu_l1if_rx_pdch(GsmL1_PhDataInd_t *data_ind) { - BitVector *block = new BitVector(23*8); - block->unpack((const unsigned char*)data_ind->msgUnitParam.u8Buffer); - COUT("RX: " << *block); - + bitvec *block = bitvec_alloc(data_ind->msgUnitParam.u8Size); + bitvec_unpack(block, data_ind->msgUnitParam.u8Buffer); + //COUT("RX: " << *block); gprs_rlcmac_rcv_block(block); + bitvec_free(block); } static int handle_ph_connect_ind(struct femtol1_hdl *fl1, GsmL1_PhConnectInd_t *connect_ind) diff --git a/pcu_l1_if.h b/pcu_l1_if.h index 0d326d55..60bc72bf 100644 --- a/pcu_l1_if.h +++ b/pcu_l1_if.h @@ -21,7 +21,7 @@ #define PCU_L1_IF_H -#include +#include #include #include extern "C" { @@ -70,7 +70,7 @@ extern struct l1fwd_hdl *l1fh; 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);