aboutsummaryrefslogtreecommitdiffstats
path: root/src/csn1.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/csn1.cpp')
-rw-r--r--src/csn1.cpp155
1 files changed, 125 insertions, 30 deletions
diff --git a/src/csn1.cpp b/src/csn1.cpp
index b0ed73de..1859bebd 100644
--- a/src/csn1.cpp
+++ b/src/csn1.cpp
@@ -206,6 +206,12 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, bitvec *vector, unsig
LOGPC(DCSN1, LOGL_NOTICE, "%s = %u | ", pDescr->sz , (unsigned)*pui8);
/* end add the bit value to protocol tree */
}
+ else if(pDescr->may_be_null)
+ {
+ pui8 = pui8DATA(data, pDescr->offset);
+ *pui8 = 0;
+ LOGPC(DCSN1, LOGL_NOTICE, "%s = NULL | ", pDescr->sz);
+ }
else
{
return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);
@@ -254,14 +260,33 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, bitvec *vector, unsig
{
return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_GENERAL, pDescr);
}
+ remaining_bits_len -= no_of_bits;
+ bit_offset += no_of_bits;
+ }
+ else if(pDescr->may_be_null)
+ {
+ if (no_of_bits <= 8)
+ {
+ pui8 = pui8DATA(data, pDescr->offset);
+ *pui8 = 0;
+ }
+ else if (no_of_bits <= 16)
+ {
+ pui16 = pui16DATA(data, pDescr->offset);
+ *pui16 = 0;
+ }
+ else if (no_of_bits <= 32)
+ {
+ pui32 = pui32DATA(data, pDescr->offset);
+ *pui32 = 0;
+ }
+ LOGPC(DCSN1, LOGL_NOTICE, "%s = NULL | ", pDescr->sz);
}
else
{
return ProcessError(readIndex,"csnStreamDecoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);
}
- remaining_bits_len -= no_of_bits;
- bit_offset += no_of_bits;
pDescr++;
break;
}
@@ -548,20 +573,23 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, bitvec *vector, unsig
{
StreamSerializeFcn_t serialize = pDescr->serialize.fcn;
csnStream_t arT = *ar;
+ guint8 length_len = pDescr->i;
gint16 Status = -1;
- LOGPC(DCSN1, LOGL_NOTICE, "%s length = %d | ", pDescr->sz , (int)bitvec_read_field(vector, readIndex, 7));
+ guint8 length = bitvec_read_field(vector, readIndex, length_len);
+
+ LOGPC(DCSN1, LOGL_NOTICE, "%s length = %d | ", pDescr->sz , (int)length);
arT.direction = 1;
- bit_offset += 7;
- remaining_bits_len -= 7;
+ bit_offset += length_len;
+ remaining_bits_len -= length_len;
- csnStreamInit(&arT, bit_offset, remaining_bits_len);
+ csnStreamInit(&arT, bit_offset, length);
Status = serialize(&arT, vector, readIndex, pvDATA(data, pDescr->offset));
if (Status >= 0)
{
- remaining_bits_len = arT.remaining_bits_len;
- bit_offset = arT.bit_offset;
+ remaining_bits_len -= length;
+ bit_offset += length;
pDescr++;
}
else
@@ -958,18 +986,12 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, bitvec *vector, unsig
pui8 = pui8DATA(data, pDescr->offset);
/* this if-statement represents the M_NEXT_EXIST_OR_NULL description element */
- if ((pDescr->descr.ptr != NULL) && (remaining_bits_len == 0))
+ if ((pDescr->may_be_null) && (remaining_bits_len == 0))
{ /* no more bits to decode is fine here - end of message detected and allowed */
/* Skip i entries + this entry */
pDescr += pDescr->i + 1;
- /* pDescr now must be pointing to a CSN_END entry, if not this is an error */
- if ( pDescr->type != CSN_END )
- { /* Substract one more bit from remaining_bits_len to make the "not enough bits" error to be triggered */
- remaining_bits_len--;
- }
-
/* Set the data member to "not exist" */
*pui8 = 0;
break;
@@ -1147,6 +1169,38 @@ csnStreamDecoder(csnStream_t* ar, const CSN_DESCR* pDescr, bitvec *vector, unsig
break;
}
+ case CSN_PADDING_BITS:
+ { /* Padding from here and to the end of message */
+ LOGPC(DCSN1, LOGL_NOTICE, "%s = ", pDescr->sz);
+ if (remaining_bits_len > 0)
+ {
+ while (remaining_bits_len > 0)
+ {
+ guint8 bits_to_handle = remaining_bits_len%8;
+ if (bits_to_handle > 0)
+ {
+ LOGPC(DCSN1, LOGL_NOTICE, "%u|", bitvec_read_field(vector, readIndex, bits_to_handle));
+ remaining_bits_len -= bits_to_handle;
+ bit_offset += bits_to_handle;
+ }
+ else if (bits_to_handle == 0)
+ {
+ LOGPC(DCSN1, LOGL_NOTICE, "%u|", bitvec_read_field(vector, readIndex, 8));
+ remaining_bits_len -= 8;
+ bit_offset += 8;
+ }
+ }
+ }
+ if (remaining_bits_len < 0)
+ {
+ return ProcessError(readIndex,"csnStreamDissector", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);
+ }
+
+ /* Padding was successfully extracted or it was empty */
+ pDescr++;
+ break;
+ }
+
case CSN_VARIABLE_ARRAY:
{ /* {int type; int i; void* descr; int offset; const char* sz; } CSN_DESCR;
* {CSN_VARIABLE_ARRAY, _OFFSET, (void*)offsetof(_STRUCT, _ElementCountField), offsetof(_STRUCT, _MEMBER), #_MEMBER}
@@ -1434,6 +1488,10 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, bitvec *vector
LOGPC(DCSN1, LOGL_NOTICE, "%s = %u | ", pDescr->sz , (unsigned)*pui8);
/* end add the bit value to protocol tree */
}
+ else if(pDescr->may_be_null)
+ {
+ LOGPC(DCSN1, LOGL_NOTICE, "%s = NULL | ", pDescr->sz);
+ }
else
{
return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);
@@ -1479,14 +1537,19 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, bitvec *vector
{
return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_GENERAL, pDescr);
}
+
+ remaining_bits_len -= no_of_bits;
+ bit_offset += no_of_bits;
+ }
+ else if(pDescr->may_be_null)
+ {
+ LOGPC(DCSN1, LOGL_NOTICE, "%s = NULL | ", pDescr->sz);
}
else
{
return ProcessError(writeIndex,"csnStreamEncoder", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);
}
- remaining_bits_len -= no_of_bits;
- bit_offset += no_of_bits;
pDescr++;
break;
}
@@ -1766,19 +1829,20 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, bitvec *vector
{
StreamSerializeFcn_t serialize = pDescr->serialize.fcn;
csnStream_t arT = *ar;
+ guint8 length_len = pDescr->i;
gint16 Status = -1;
unsigned lengthIndex;
// store writeIndex for length value (7 bit)
- lengthIndex = writeIndex;
- writeIndex += 7;
- bit_offset += 7;
- remaining_bits_len -= 7;
+ lengthIndex = writeIndex;
+ writeIndex += length_len;
+ bit_offset += length_len;
+ remaining_bits_len -= length_len;
arT.direction = 0;
csnStreamInit(&arT, bit_offset, remaining_bits_len);
Status = serialize(&arT, vector, writeIndex, pvDATA(data, pDescr->offset));
-
- bitvec_write_field(vector, lengthIndex, writeIndex-lengthIndex-7, 7);
+
+ bitvec_write_field(vector, lengthIndex, writeIndex-lengthIndex-length_len, length_len);
LOGPC(DCSN1, LOGL_NOTICE, "%s length = %u | ", pDescr->sz , (unsigned)(writeIndex-lengthIndex));
if (Status >= 0)
@@ -2179,18 +2243,12 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, bitvec *vector
pui8 = pui8DATA(data, pDescr->offset);
/* this if-statement represents the M_NEXT_EXIST_OR_NULL description element */
- if ((pDescr->descr.ptr != NULL) && (remaining_bits_len == 0))
+ if ((pDescr->may_be_null) && (remaining_bits_len == 0))
{ /* no more bits to decode is fine here - end of message detected and allowed */
/* Skip i entries + this entry */
pDescr += pDescr->i + 1;
- /* pDescr now must be pointing to a CSN_END entry, if not this is an error */
- if ( pDescr->type != CSN_END )
- { /* Substract one more bit from remaining_bits_len to make the "not enough bits" error to be triggered */
- remaining_bits_len--;
- }
-
break;
}
@@ -2365,6 +2423,42 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, bitvec *vector
break;
}
+ case CSN_PADDING_BITS:
+ { /* Padding from here and to the end of message */
+ LOGPC(DCSN1, LOGL_NOTICE, "%s = ", pDescr->sz);
+ guint8 filler = 0x2b;
+ if (remaining_bits_len > 0)
+ {
+ while (remaining_bits_len > 0)
+ {
+ guint8 bits_to_handle = remaining_bits_len%8;
+ if (bits_to_handle > 0)
+ {
+ guint8 fl = filler&(0xff>>(8-bits_to_handle));
+ bitvec_write_field(vector, writeIndex, fl, bits_to_handle);
+ LOGPC(DCSN1, LOGL_NOTICE, "%u|", fl);
+ remaining_bits_len -= bits_to_handle;
+ bit_offset += bits_to_handle;
+ }
+ else if (bits_to_handle == 0)
+ {
+ bitvec_write_field(vector, writeIndex, filler, 8);
+ LOGPC(DCSN1, LOGL_NOTICE, "%u|", filler);
+ remaining_bits_len -= 8;
+ bit_offset += 8;
+ }
+ }
+ }
+ if (remaining_bits_len < 0)
+ {
+ return ProcessError(writeIndex,"csnStreamDissector", CSN_ERROR_NEED_MORE_BITS_TO_UNPACK, pDescr);
+ }
+
+ /* Padding was successfully extracted or it was empty */
+ pDescr++;
+ break;
+ }
+
case CSN_VARIABLE_ARRAY:
{ /* {int type; int i; void* descr; int offset; const char* sz; } CSN_DESCR;
* {CSN_VARIABLE_ARRAY, _OFFSET, (void*)offsetof(_STRUCT, _ElementCountField), offsetof(_STRUCT, _MEMBER), #_MEMBER}
@@ -2555,6 +2649,7 @@ gint16 csnStreamEncoder(csnStream_t* ar, const CSN_DESCR* pDescr, bitvec *vector
}
bitvec_write_field(vector, writeIndex, !Tag, 1);
bit_offset++;
+ remaining_bits_len--;
Tag = STANDARD_TAG; /* in case it was set to "reversed" */
pDescr++;
break;