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 <iostream>
#include <cstdlib>
#include <cstring>
#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);
}
}

184
csn1.cpp
View File

@ -30,6 +30,8 @@
#include <iostream>
#include <cstdlib>
#include <assert.h>
#include <string.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 */
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;

8
csn1.h
View File

@ -25,7 +25,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <BitVector.h>
#include <bitvector.h>
#include <iostream>
#include <cstdlib>
#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)\

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);
}
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);
}

View File

@ -20,7 +20,7 @@
#ifndef GPRS_RLCMAC_H
#define GPRS_RLCMAC_H
#include <BitVector.h>
#include <bitvector.h>
#include <gsm_rlcmac.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);
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);

View File

@ -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]);
}
}

View File

@ -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__ */

View File

@ -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)

View File

@ -21,7 +21,7 @@
#define PCU_L1_IF_H
#include <BitVector.h>
#include <bitvector.h>
#include <gsmL1prim.h>
#include <sys/socket.h>
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);