summaryrefslogtreecommitdiffstats
path: root/tinySMS/src/rpdu/tsms_rpdu.c
diff options
context:
space:
mode:
Diffstat (limited to 'tinySMS/src/rpdu/tsms_rpdu.c')
-rwxr-xr-xtinySMS/src/rpdu/tsms_rpdu.c782
1 files changed, 389 insertions, 393 deletions
diff --git a/tinySMS/src/rpdu/tsms_rpdu.c b/tinySMS/src/rpdu/tsms_rpdu.c
index 72640b9..4f3d8d0 100755
--- a/tinySMS/src/rpdu/tsms_rpdu.c
+++ b/tinySMS/src/rpdu/tsms_rpdu.c
@@ -2,19 +2,19 @@
* Copyright (C) 2009 Mamadou Diop.
*
* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
-*
+*
* This file is part of Open Source Doubango Framework.
*
* DOUBANGO is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
-*
+*
* DOUBANGO is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
-*
+*
* You should have received a copy of the GNU General Public License
* along with DOUBANGO.
*
@@ -42,93 +42,93 @@
/** internal function used to deserialize a RP-DATA message from binary content. */
tsms_rpdu_message_t* _tsms_rpdu_rpdata_deserialize(const void* data, tsk_size_t size)
{
- /* don't need to test data and size --> already done by tsms_rpdu_message_deserialize() */
- tsms_rpdu_data_t* self = tsms_rpdu_data_create(0x00, tsk_null, tsk_null, tsk_false);
- tsk_bool_t failed = tsk_false;
- const uint8_t* pdata = data;
- const uint8_t* pend = pdata + size;
- tsk_size_t smsc_len;
-
- /* 3GPP TS 24.011 ==> 8.2.2 Message type indicator (MTI) */
- TSMS_RPDU_MESSAGE(self)->mti = *pdata++;
-
- /* 3GPP TS 24.011 ==> 8.2.3 Message reference */
- TSMS_RPDU_MESSAGE(self)->mr = *pdata++;
-
- /* 3GPP TS 24.011 ==> 8.2.5.1 Originator address element */
- if(TSMS_RPDU_MESSAGE(self)->mti == tsms_rpdu_type_data_mt){
- /* 7.3.1.1 RP DATA (Network to Mobile Station) */
- if((self->oa = tsms_address_deserialize(pdata, (pend-pdata), tsms_addr_smsc, &smsc_len))){
- pdata += smsc_len;
- }
- /* 7.3.1.2 RP DATA (Mobile Station to Network) */
- pdata++; /* 1o */
- }
- else if(TSMS_RPDU_MESSAGE(self)->mti == tsms_rpdu_type_data_mo){
- /* 7.3.1.1 RP DATA (Network to Mobile Station) */
- pdata++; /* 1o */
- /* 7.3.1.2 RP DATA (Mobile Station to Network) */
- if((self->da = tsms_address_deserialize(pdata, (pend-pdata), tsms_addr_smsc, &smsc_len))){
- pdata += smsc_len;
- }
- }
- else{
- failed = tsk_true;
- TSK_DEBUG_ERROR("%d Not a valid RP-DATA messsage", TSMS_RPDU_MESSAGE(self)->mti);
- goto bail;
- }
-
- /* 3GPP TS 24.011 ==> 8.2.5.3 RP-User data element */
- if((pend-pdata) > 1){
- tsk_size_t length = *pdata++; // length-indicator
- if((length != (pend-pdata))){
- TSK_DEBUG_WARN("Invalid length-indicator.");
- }
- else{
- self->udata = tsk_buffer_create(pdata, length);
- }
- }
- else{
- TSK_DEBUG_WARN("RP-User data element is mandatory for RP-DATA messages.");
- }
-
+ /* don't need to test data and size --> already done by tsms_rpdu_message_deserialize() */
+ tsms_rpdu_data_t* self = tsms_rpdu_data_create(0x00, tsk_null, tsk_null, tsk_false);
+ tsk_bool_t failed = tsk_false;
+ const uint8_t* pdata = data;
+ const uint8_t* pend = pdata + size;
+ tsk_size_t smsc_len;
+
+ /* 3GPP TS 24.011 ==> 8.2.2 Message type indicator (MTI) */
+ TSMS_RPDU_MESSAGE(self)->mti = *pdata++;
+
+ /* 3GPP TS 24.011 ==> 8.2.3 Message reference */
+ TSMS_RPDU_MESSAGE(self)->mr = *pdata++;
+
+ /* 3GPP TS 24.011 ==> 8.2.5.1 Originator address element */
+ if(TSMS_RPDU_MESSAGE(self)->mti == tsms_rpdu_type_data_mt) {
+ /* 7.3.1.1 RP DATA (Network to Mobile Station) */
+ if((self->oa = tsms_address_deserialize(pdata, (pend-pdata), tsms_addr_smsc, &smsc_len))) {
+ pdata += smsc_len;
+ }
+ /* 7.3.1.2 RP DATA (Mobile Station to Network) */
+ pdata++; /* 1o */
+ }
+ else if(TSMS_RPDU_MESSAGE(self)->mti == tsms_rpdu_type_data_mo) {
+ /* 7.3.1.1 RP DATA (Network to Mobile Station) */
+ pdata++; /* 1o */
+ /* 7.3.1.2 RP DATA (Mobile Station to Network) */
+ if((self->da = tsms_address_deserialize(pdata, (pend-pdata), tsms_addr_smsc, &smsc_len))) {
+ pdata += smsc_len;
+ }
+ }
+ else {
+ failed = tsk_true;
+ TSK_DEBUG_ERROR("%d Not a valid RP-DATA messsage", TSMS_RPDU_MESSAGE(self)->mti);
+ goto bail;
+ }
+
+ /* 3GPP TS 24.011 ==> 8.2.5.3 RP-User data element */
+ if((pend-pdata) > 1) {
+ tsk_size_t length = *pdata++; // length-indicator
+ if((length != (pend-pdata))) {
+ TSK_DEBUG_WARN("Invalid length-indicator.");
+ }
+ else {
+ self->udata = tsk_buffer_create(pdata, length);
+ }
+ }
+ else {
+ TSK_DEBUG_WARN("RP-User data element is mandatory for RP-DATA messages.");
+ }
+
bail:
- if(failed){
- TSK_OBJECT_SAFE_FREE(self);
- }
- return TSMS_RPDU_MESSAGE(self);
+ if(failed) {
+ TSK_OBJECT_SAFE_FREE(self);
+ }
+ return TSMS_RPDU_MESSAGE(self);
}
/** internal function used to serialize a RP-DATA message as binary content.*/
int _tsms_rpdu_rpdata_serialize(const tsms_rpdu_message_t* _self, tsk_buffer_t* output)
{
- /* don't need to test output and self --> already done by tsms_rpdu_message_serialize() */
- const tsms_rpdu_data_t* self = (const tsms_rpdu_data_t*)_self;
+ /* don't need to test output and self --> already done by tsms_rpdu_message_serialize() */
+ const tsms_rpdu_data_t* self = (const tsms_rpdu_data_t*)_self;
- /* 3GPP TS 24.011 ==> 8.2.2 Message type indicator (MTI) */
- tsk_buffer_append(output, &_self->mti, 1);
+ /* 3GPP TS 24.011 ==> 8.2.2 Message type indicator (MTI) */
+ tsk_buffer_append(output, &_self->mti, 1);
- /* 3GPP TS 24.011 ==> 8.2.3 Message reference */
- tsk_buffer_append(output, &_self->mr, 1);
+ /* 3GPP TS 24.011 ==> 8.2.3 Message reference */
+ tsk_buffer_append(output, &_self->mr, 1);
- /* 3GPP TS 24.011 ==> 8.2.5.1 Originator address element */
- tsms_address_serialize(self->oa, output);
+ /* 3GPP TS 24.011 ==> 8.2.5.1 Originator address element */
+ tsms_address_serialize(self->oa, output);
- /* 3GPP TS 24.011 ==> 8.2.5.2 Destination address element */
- tsms_address_serialize(self->da, output);
+ /* 3GPP TS 24.011 ==> 8.2.5.2 Destination address element */
+ tsms_address_serialize(self->da, output);
- /* 3GPP TS 24.011 ==> 8.2.5.3 RP-User data element */
- if(self->udata){
- tsk_buffer_append(output, &self->udata->size, 1); // length-indicator
- tsk_buffer_append(output, self->udata->data, self->udata->size);
- }
- else{
- static uint8_t _1byte = 0x00;
- tsk_buffer_append(output, &_1byte, 1); // length-indicator
- }
+ /* 3GPP TS 24.011 ==> 8.2.5.3 RP-User data element */
+ if(self->udata) {
+ tsk_buffer_append(output, &self->udata->size, 1); // length-indicator
+ tsk_buffer_append(output, self->udata->data, self->udata->size);
+ }
+ else {
+ static uint8_t _1byte = 0x00;
+ tsk_buffer_append(output, &_1byte, 1); // length-indicator
+ }
- return 0;
+ return 0;
}
/**@ingroup tsms_rpdu_group
@@ -146,45 +146,45 @@ int _tsms_rpdu_rpdata_serialize(const tsms_rpdu_message_t* _self, tsk_buffer_t*
*/
tsms_rpdu_data_t* tsms_rpdu_data_create(uint8_t mr, const tsms_address_string_t smsc, const tsms_tpdu_message_t* tpdu, tsk_bool_t MobOrig)
{
- tsms_rpdu_data_t* ret = tsk_null;
-
- if(!(ret = tsk_object_new(tsms_rpdu_data_def_t))){
- goto bail;
- }
-
- /* 3GPP TS 24.011 ==> 8.2.2 Message type indicator (MTI) */
- TSMS_RPDU_MESSAGE(ret)->mti = MobOrig? tsms_rpdu_type_data_mo : tsms_rpdu_type_data_mt;
-
- /* 3GPP TS 24.011 ==> 8.2.3 Message reference */
- TSMS_RPDU_MESSAGE(ret)->mr = mr;
-
- /* 3GPP TS 24.341 section B5 (Moblie Originated RP-DATA message)
- The payload includes an RP-DATA message (see 3GPP TS 24.011 [8]). It includes:
- - Address of the originating UE: this field includes the length indicator only;
- - Address of the destination SC, which is configured in the UE; and
- - RP-User-Data (see 3GPP TS 23.040 [3]), which includes SMS-SUBMIT as type indicator.
- */
-
-
- /* 3GPP TS 24.011 ==> 8.2.5.1 Originator address element */
- if(smsc){
- if(TSMS_RPDU_MESSAGE(ret)->mti == tsms_rpdu_type_data_mt){
- /* 7.3.1.1 RP DATA (Network to Mobile Station) */
- ret->oa = tsms_address_smsc_create(smsc);
- }
- else{
- /* 7.3.1.2 RP DATA (Mobile Station to Network) */
- ret->da = tsms_address_smsc_create(smsc);
- }
- }
-
- /* 3GPP TS 24.011 ==> 8.2.5.3 RP-User data element */
- if(tpdu && (ret->udata = tsk_buffer_create_null())){
- tsms_tpdu_message_serialize(tpdu, ret->udata, MobOrig);
- }
+ tsms_rpdu_data_t* ret = tsk_null;
+
+ if(!(ret = tsk_object_new(tsms_rpdu_data_def_t))) {
+ goto bail;
+ }
+
+ /* 3GPP TS 24.011 ==> 8.2.2 Message type indicator (MTI) */
+ TSMS_RPDU_MESSAGE(ret)->mti = MobOrig? tsms_rpdu_type_data_mo : tsms_rpdu_type_data_mt;
+
+ /* 3GPP TS 24.011 ==> 8.2.3 Message reference */
+ TSMS_RPDU_MESSAGE(ret)->mr = mr;
+
+ /* 3GPP TS 24.341 section B5 (Moblie Originated RP-DATA message)
+ The payload includes an RP-DATA message (see 3GPP TS 24.011 [8]). It includes:
+ - Address of the originating UE: this field includes the length indicator only;
+ - Address of the destination SC, which is configured in the UE; and
+ - RP-User-Data (see 3GPP TS 23.040 [3]), which includes SMS-SUBMIT as type indicator.
+ */
+
+
+ /* 3GPP TS 24.011 ==> 8.2.5.1 Originator address element */
+ if(smsc) {
+ if(TSMS_RPDU_MESSAGE(ret)->mti == tsms_rpdu_type_data_mt) {
+ /* 7.3.1.1 RP DATA (Network to Mobile Station) */
+ ret->oa = tsms_address_smsc_create(smsc);
+ }
+ else {
+ /* 7.3.1.2 RP DATA (Mobile Station to Network) */
+ ret->da = tsms_address_smsc_create(smsc);
+ }
+ }
+
+ /* 3GPP TS 24.011 ==> 8.2.5.3 RP-User data element */
+ if(tpdu && (ret->udata = tsk_buffer_create_null())) {
+ tsms_tpdu_message_serialize(tpdu, ret->udata, MobOrig);
+ }
bail:
- return ret;
+ return ret;
}
//
@@ -192,37 +192,36 @@ bail:
//
static tsk_object_t* tsms_rpdu_data_ctor(tsk_object_t * self, va_list * app)
{
- tsms_rpdu_data_t *rpdata = self;
- if(rpdata){
- TSMS_RPDU_MESSAGE(rpdata)->mti = tsms_rpdu_type_data_mo;
- }
- else{
- TSK_DEBUG_ERROR("Null");
- }
- return self;
+ tsms_rpdu_data_t *rpdata = self;
+ if(rpdata) {
+ TSMS_RPDU_MESSAGE(rpdata)->mti = tsms_rpdu_type_data_mo;
+ }
+ else {
+ TSK_DEBUG_ERROR("Null");
+ }
+ return self;
}
static tsk_object_t* tsms_rpdu_data_dtor(tsk_object_t * self)
-{
- tsms_rpdu_data_t *rpdata = self;
- if(rpdata){
- TSK_OBJECT_SAFE_FREE(rpdata->oa);
- TSK_OBJECT_SAFE_FREE(rpdata->da);
- TSK_OBJECT_SAFE_FREE(rpdata->udata);
- }
- else{
- TSK_DEBUG_ERROR("Null");
- }
-
- return self;
+{
+ tsms_rpdu_data_t *rpdata = self;
+ if(rpdata) {
+ TSK_OBJECT_SAFE_FREE(rpdata->oa);
+ TSK_OBJECT_SAFE_FREE(rpdata->da);
+ TSK_OBJECT_SAFE_FREE(rpdata->udata);
+ }
+ else {
+ TSK_DEBUG_ERROR("Null");
+ }
+
+ return self;
}
-static const tsk_object_def_t tsms_rpdu_data_def_s =
-{
- sizeof(tsms_rpdu_data_t),
- tsms_rpdu_data_ctor,
- tsms_rpdu_data_dtor,
- tsk_null,
+static const tsk_object_def_t tsms_rpdu_data_def_s = {
+ sizeof(tsms_rpdu_data_t),
+ tsms_rpdu_data_ctor,
+ tsms_rpdu_data_dtor,
+ tsk_null,
};
const tsk_object_def_t *tsms_rpdu_data_def_t = &tsms_rpdu_data_def_s;
@@ -231,32 +230,32 @@ const tsk_object_def_t *tsms_rpdu_data_def_t = &tsms_rpdu_data_def_s;
/** internal function used to deserialize a RP-SMMA message from binary content. */
tsms_rpdu_message_t* _tsms_rpdu_rpsmma_deserialize(const void* data, tsk_size_t size)
{
- /* don't need to test data and size --> already done by tsms_rpdu_message_deserialize() */
- tsms_rpdu_smma_t* self = tsms_rpdu_smma_create(0);
- const uint8_t* pdata = data;
-
- /* 3GPP TS 24.011 ==> 8.2.2 Message type indicator (MTI) */
- TSMS_RPDU_MESSAGE(self)->mti = *pdata++;
-
- /* 3GPP TS 24.011 ==> 8.2.3 Message reference */
- TSMS_RPDU_MESSAGE(self)->mr = *pdata++;
-
- return TSMS_RPDU_MESSAGE(self);
+ /* don't need to test data and size --> already done by tsms_rpdu_message_deserialize() */
+ tsms_rpdu_smma_t* self = tsms_rpdu_smma_create(0);
+ const uint8_t* pdata = data;
+
+ /* 3GPP TS 24.011 ==> 8.2.2 Message type indicator (MTI) */
+ TSMS_RPDU_MESSAGE(self)->mti = *pdata++;
+
+ /* 3GPP TS 24.011 ==> 8.2.3 Message reference */
+ TSMS_RPDU_MESSAGE(self)->mr = *pdata++;
+
+ return TSMS_RPDU_MESSAGE(self);
}
/** internal function used to serialize a RP-SMMA message as binary content. */
int _tsms_rpdu_rpsmma_serialize(const tsms_rpdu_message_t* _self, tsk_buffer_t* output)
{
- /* don't need to test output and self --> already done by tsms_rpdu_message_serialize() */
- //const tsms_rpdu_smma_t* self = (const tsms_rpdu_smma_t*)_self;
+ /* don't need to test output and self --> already done by tsms_rpdu_message_serialize() */
+ //const tsms_rpdu_smma_t* self = (const tsms_rpdu_smma_t*)_self;
- /* 3GPP TS 24.011 ==> 8.2.2 Message type indicator (MTI) */
- tsk_buffer_append(output, &_self->mti, 1);
+ /* 3GPP TS 24.011 ==> 8.2.2 Message type indicator (MTI) */
+ tsk_buffer_append(output, &_self->mti, 1);
- /* 3GPP TS 24.011 ==> 8.2.3 Message reference */
- tsk_buffer_append(output, &_self->mr, 1);
+ /* 3GPP TS 24.011 ==> 8.2.3 Message reference */
+ tsk_buffer_append(output, &_self->mr, 1);
- return 0;
+ return 0;
}
/**@ingroup tsms_rpdu_group
@@ -270,12 +269,12 @@ int _tsms_rpdu_rpsmma_serialize(const tsms_rpdu_message_t* _self, tsk_buffer_t*
*/
tsms_rpdu_smma_t* tsms_rpdu_smma_create(uint8_t mr)
{
- tsms_rpdu_smma_t* ret = tsk_null;
+ tsms_rpdu_smma_t* ret = tsk_null;
- if((ret = tsk_object_new(tsms_rpdu_smma_def_t))){
- TSMS_RPDU_MESSAGE(ret)->mr = mr;
- }
- return ret;
+ if((ret = tsk_object_new(tsms_rpdu_smma_def_t))) {
+ TSMS_RPDU_MESSAGE(ret)->mr = mr;
+ }
+ return ret;
}
//
@@ -283,34 +282,33 @@ tsms_rpdu_smma_t* tsms_rpdu_smma_create(uint8_t mr)
//
static tsk_object_t* tsms_rpdu_smma_ctor(tsk_object_t * self, va_list * app)
{
- tsms_rpdu_smma_t *smma = self;
- if(smma){
- TSMS_RPDU_MESSAGE(smma)->mti = tsms_rpdu_type_smma_mo;
- }
- else{
- TSK_DEBUG_ERROR("Null");
- }
- return self;
+ tsms_rpdu_smma_t *smma = self;
+ if(smma) {
+ TSMS_RPDU_MESSAGE(smma)->mti = tsms_rpdu_type_smma_mo;
+ }
+ else {
+ TSK_DEBUG_ERROR("Null");
+ }
+ return self;
}
static tsk_object_t* tsms_rpdu_smma_dtor(tsk_object_t * self)
-{
- tsms_rpdu_smma_t *smma = self;
- if(smma){
- }
- else{
- TSK_DEBUG_ERROR("Null");
- }
-
- return self;
+{
+ tsms_rpdu_smma_t *smma = self;
+ if(smma) {
+ }
+ else {
+ TSK_DEBUG_ERROR("Null");
+ }
+
+ return self;
}
-static const tsk_object_def_t tsms_rpdu_smma_def_s =
-{
- sizeof(tsms_rpdu_smma_t),
- tsms_rpdu_smma_ctor,
- tsms_rpdu_smma_dtor,
- tsk_null,
+static const tsk_object_def_t tsms_rpdu_smma_def_s = {
+ sizeof(tsms_rpdu_smma_t),
+ tsms_rpdu_smma_ctor,
+ tsms_rpdu_smma_dtor,
+ tsk_null,
};
const tsk_object_def_t *tsms_rpdu_smma_def_t = &tsms_rpdu_smma_def_s;
@@ -320,58 +318,58 @@ const tsk_object_def_t *tsms_rpdu_smma_def_t = &tsms_rpdu_smma_def_s;
/** internal function used to deserialize an RP-ACK message from binary content. */
tsms_rpdu_message_t* _tsms_rpdu_rpack_deserialize(const void* data, tsk_size_t size)
{
- /* don't need to test data and size --> already done by tsms_rpdu_message_deserialize() */
- tsms_rpdu_ack_t* self = tsms_rpdu_ack_create(0, tsk_null, tsk_false);
- const uint8_t* pdata = data;
- const uint8_t* pend = pdata + size;
-
- /* 3GPP TS 24.011 ==> 8.2.2 Message type indicator (MTI) */
- TSMS_RPDU_MESSAGE(self)->mti = *pdata++;
-
- /* 3GPP TS 24.011 ==> 8.2.3 Message reference */
- TSMS_RPDU_MESSAGE(self)->mr = *pdata++;
-
- /* 3GPP TS 24.011 ==> 8.2.5.3 RP-User data element */
- if((pend-pdata) > 1){
- tsk_size_t length;
- /*uint8_t iei =*/ (void)(*pdata++); // IEI MUST be equal to 0x41
- length = *pdata++; // length-indicator
- if((length != (pend-pdata))){
- TSK_DEBUG_WARN("Invalid length-indicator.");
- }
- else{
- self->udata = tsk_buffer_create(pdata, length);
- }
- }
-
- return TSMS_RPDU_MESSAGE(self);
+ /* don't need to test data and size --> already done by tsms_rpdu_message_deserialize() */
+ tsms_rpdu_ack_t* self = tsms_rpdu_ack_create(0, tsk_null, tsk_false);
+ const uint8_t* pdata = data;
+ const uint8_t* pend = pdata + size;
+
+ /* 3GPP TS 24.011 ==> 8.2.2 Message type indicator (MTI) */
+ TSMS_RPDU_MESSAGE(self)->mti = *pdata++;
+
+ /* 3GPP TS 24.011 ==> 8.2.3 Message reference */
+ TSMS_RPDU_MESSAGE(self)->mr = *pdata++;
+
+ /* 3GPP TS 24.011 ==> 8.2.5.3 RP-User data element */
+ if((pend-pdata) > 1) {
+ tsk_size_t length;
+ /*uint8_t iei =*/ (void)(*pdata++); // IEI MUST be equal to 0x41
+ length = *pdata++; // length-indicator
+ if((length != (pend-pdata))) {
+ TSK_DEBUG_WARN("Invalid length-indicator.");
+ }
+ else {
+ self->udata = tsk_buffer_create(pdata, length);
+ }
+ }
+
+ return TSMS_RPDU_MESSAGE(self);
}
/** internal function used to serialize a RP-ACK message as binary content. */
int _tsms_rpdu_rpack_serialize(const tsms_rpdu_message_t* _self, tsk_buffer_t* output)
{
- /* don't need to test output and self --> already done by tsms_rpdu_message_serialize() */
- const tsms_rpdu_ack_t* self = (const tsms_rpdu_ack_t*)_self;
-
- /* 3GPP TS 24.011 ==> 8.2.2 Message type indicator (MTI) */
- tsk_buffer_append(output, &_self->mti, 1);
-
- /* 3GPP TS 24.011 ==> 8.2.3 Message reference */
- tsk_buffer_append(output, &_self->mr, 1);
-
- /* 3GPP TS 24.011 ==> 8.2.5.3 RP-User data element */
- if(self->udata){
- static uint8_t iei = 0x41;
- tsk_buffer_append(output, &iei, 1); // IEI
- tsk_buffer_append(output, &self->udata->size, 1); // length-indicator
- tsk_buffer_append(output, self->udata->data, self->udata->size);
- }
- else{
- static uint8_t _1byte = 0x00;
- tsk_buffer_append(output, &_1byte, 1); // length-indicator
- }
-
- return 0;
+ /* don't need to test output and self --> already done by tsms_rpdu_message_serialize() */
+ const tsms_rpdu_ack_t* self = (const tsms_rpdu_ack_t*)_self;
+
+ /* 3GPP TS 24.011 ==> 8.2.2 Message type indicator (MTI) */
+ tsk_buffer_append(output, &_self->mti, 1);
+
+ /* 3GPP TS 24.011 ==> 8.2.3 Message reference */
+ tsk_buffer_append(output, &_self->mr, 1);
+
+ /* 3GPP TS 24.011 ==> 8.2.5.3 RP-User data element */
+ if(self->udata) {
+ static uint8_t iei = 0x41;
+ tsk_buffer_append(output, &iei, 1); // IEI
+ tsk_buffer_append(output, &self->udata->size, 1); // length-indicator
+ tsk_buffer_append(output, self->udata->data, self->udata->size);
+ }
+ else {
+ static uint8_t _1byte = 0x00;
+ tsk_buffer_append(output, &_1byte, 1); // length-indicator
+ }
+
+ return 0;
}
/**@ingroup tsms_rpdu_group
@@ -387,29 +385,29 @@ int _tsms_rpdu_rpack_serialize(const tsms_rpdu_message_t* _self, tsk_buffer_t* o
*/
tsms_rpdu_ack_t* tsms_rpdu_ack_create(uint8_t mr, const tsms_tpdu_message_t* tpdu, tsk_bool_t MobOrig)
{
- tsms_rpdu_ack_t* ret = tsk_null;
-
- if(!tpdu){
- TSK_DEBUG_WARN("TPDU for RP-ACK message is Null.");
- }
-
- if(!(ret = tsk_object_new(tsms_rpdu_ack_def_t))){
- goto bail;
- }
-
- /* 3GPP TS 24.011 ==> 8.2.2 Message type indicator (MTI) */
- TSMS_RPDU_MESSAGE(ret)->mti = MobOrig? tsms_rpdu_type_ack_mo : tsms_rpdu_type_ack_mt;
-
- /* 3GPP TS 24.011 ==> 8.2.3 Message reference */
- TSMS_RPDU_MESSAGE(ret)->mr = mr;
-
- /* 3GPP TS 24.011 ==> 8.2.5.3 RP-User data element */
- if(tpdu && (ret->udata = tsk_buffer_create_null())){
- tsms_tpdu_message_serialize(tpdu, ret->udata, MobOrig);
- }
+ tsms_rpdu_ack_t* ret = tsk_null;
+
+ if(!tpdu) {
+ TSK_DEBUG_WARN("TPDU for RP-ACK message is Null.");
+ }
+
+ if(!(ret = tsk_object_new(tsms_rpdu_ack_def_t))) {
+ goto bail;
+ }
+
+ /* 3GPP TS 24.011 ==> 8.2.2 Message type indicator (MTI) */
+ TSMS_RPDU_MESSAGE(ret)->mti = MobOrig? tsms_rpdu_type_ack_mo : tsms_rpdu_type_ack_mt;
+
+ /* 3GPP TS 24.011 ==> 8.2.3 Message reference */
+ TSMS_RPDU_MESSAGE(ret)->mr = mr;
+
+ /* 3GPP TS 24.011 ==> 8.2.5.3 RP-User data element */
+ if(tpdu && (ret->udata = tsk_buffer_create_null())) {
+ tsms_tpdu_message_serialize(tpdu, ret->udata, MobOrig);
+ }
bail:
- return ret;
+ return ret;
}
//
@@ -417,35 +415,34 @@ bail:
//
static tsk_object_t* tsms_rpdu_ack_ctor(tsk_object_t * self, va_list * app)
{
- tsms_rpdu_ack_t *ack = self;
- if(ack){
- TSMS_RPDU_MESSAGE(ack)->mti = tsms_rpdu_type_ack_mo;
- }
- else{
- TSK_DEBUG_ERROR("Null");
- }
- return self;
+ tsms_rpdu_ack_t *ack = self;
+ if(ack) {
+ TSMS_RPDU_MESSAGE(ack)->mti = tsms_rpdu_type_ack_mo;
+ }
+ else {
+ TSK_DEBUG_ERROR("Null");
+ }
+ return self;
}
static tsk_object_t* tsms_rpdu_ack_dtor(tsk_object_t * self)
-{
- tsms_rpdu_ack_t *ack = self;
- if(ack){
- TSK_OBJECT_SAFE_FREE(ack->udata);
- }
- else{
- TSK_DEBUG_ERROR("Null");
- }
-
- return self;
+{
+ tsms_rpdu_ack_t *ack = self;
+ if(ack) {
+ TSK_OBJECT_SAFE_FREE(ack->udata);
+ }
+ else {
+ TSK_DEBUG_ERROR("Null");
+ }
+
+ return self;
}
-static const tsk_object_def_t tsms_rpdu_ack_def_s =
-{
- sizeof(tsms_rpdu_ack_t),
- tsms_rpdu_ack_ctor,
- tsms_rpdu_ack_dtor,
- tsk_null,
+static const tsk_object_def_t tsms_rpdu_ack_def_s = {
+ sizeof(tsms_rpdu_ack_t),
+ tsms_rpdu_ack_ctor,
+ tsms_rpdu_ack_dtor,
+ tsk_null,
};
const tsk_object_def_t *tsms_rpdu_ack_def_t = &tsms_rpdu_ack_def_s;
@@ -454,79 +451,79 @@ const tsk_object_def_t *tsms_rpdu_ack_def_t = &tsms_rpdu_ack_def_s;
/** internal function used to deserialize a RP-ERROR message from binary content. */
tsms_rpdu_message_t* _tsms_rpdu_rperror_deserialize(const void* data, tsk_size_t size)
{
- /* don't need to test data and size --> already done by tsms_rpdu_message_deserialize() */
- tsms_rpdu_error_t* self = tsms_rpdu_error_create(0, tsk_null, 0, tsk_false);
- const uint8_t* pdata = data;
- const uint8_t* pend = pdata + size;
- tsk_bool_t failed = tsk_false;
- uint8_t cause_count;
-
- /* 3GPP TS 24.011 ==> 8.2.2 Message type indicator (MTI) */
- TSMS_RPDU_MESSAGE(self)->mti = *pdata++;
-
- /* 3GPP TS 24.011 ==> 8.2.3 Message reference */
- TSMS_RPDU_MESSAGE(self)->mr = *pdata++;
-
- /* 3GPP TS 24.011 ==> 8.2.5.4 RP Cause
- * Only 1 cause (LV)*/
- if((cause_count = *pdata++)){
- self->cause[0] = cause_count;
- self->cause[1] = *pdata++;
- if((pdata += (cause_count-1)) >= pend){
- TSMS_ERROR_TOO_SHORT("RP-ERROR");
- }
- }
-
- /* 3GPP TS 24.011 ==> 8.2.5.3 RP-User data element */
- if((pend-pdata) > 2){
- tsk_size_t length;
- /*uint8_t iei =*/ (void)(*pdata++); // IEI MUST be equal to 0x41
- length = *pdata++; // length-indicator
- if((length != (pend-pdata))){
- TSK_DEBUG_WARN("Invalid length-indicator.");
- }
- else{
- self->udata = tsk_buffer_create(pdata, length);
- }
- }
-
+ /* don't need to test data and size --> already done by tsms_rpdu_message_deserialize() */
+ tsms_rpdu_error_t* self = tsms_rpdu_error_create(0, tsk_null, 0, tsk_false);
+ const uint8_t* pdata = data;
+ const uint8_t* pend = pdata + size;
+ tsk_bool_t failed = tsk_false;
+ uint8_t cause_count;
+
+ /* 3GPP TS 24.011 ==> 8.2.2 Message type indicator (MTI) */
+ TSMS_RPDU_MESSAGE(self)->mti = *pdata++;
+
+ /* 3GPP TS 24.011 ==> 8.2.3 Message reference */
+ TSMS_RPDU_MESSAGE(self)->mr = *pdata++;
+
+ /* 3GPP TS 24.011 ==> 8.2.5.4 RP Cause
+ * Only 1 cause (LV)*/
+ if((cause_count = *pdata++)) {
+ self->cause[0] = cause_count;
+ self->cause[1] = *pdata++;
+ if((pdata += (cause_count-1)) >= pend) {
+ TSMS_ERROR_TOO_SHORT("RP-ERROR");
+ }
+ }
+
+ /* 3GPP TS 24.011 ==> 8.2.5.3 RP-User data element */
+ if((pend-pdata) > 2) {
+ tsk_size_t length;
+ /*uint8_t iei =*/ (void)(*pdata++); // IEI MUST be equal to 0x41
+ length = *pdata++; // length-indicator
+ if((length != (pend-pdata))) {
+ TSK_DEBUG_WARN("Invalid length-indicator.");
+ }
+ else {
+ self->udata = tsk_buffer_create(pdata, length);
+ }
+ }
+
bail:
- if(failed){
- TSK_OBJECT_SAFE_FREE(self);
- }
- return TSMS_RPDU_MESSAGE(self);
+ if(failed) {
+ TSK_OBJECT_SAFE_FREE(self);
+ }
+ return TSMS_RPDU_MESSAGE(self);
}
/** internal function used to serialize a RP-ERROR message as binary content. */
int _tsms_rpdu_rperror_serialize(const tsms_rpdu_message_t* _self, tsk_buffer_t* output)
{
- /* don't need to test output and self --> already done by tsms_rpdu_message_serialize() */
- const tsms_rpdu_error_t* self = (const tsms_rpdu_error_t*)_self;
-
- /* 3GPP TS 24.011 ==> 8.2.2 Message type indicator (MTI) */
- tsk_buffer_append(output, &_self->mti, 1);
-
- /* 3GPP TS 24.011 ==> 8.2.3 Message reference */
- tsk_buffer_append(output, &_self->mr, 1);
-
- /* 3GPP TS 24.011 ==> 8.2.5.4 RP Cause
- * Only 1 cause (LV)*/
- tsk_buffer_append(output, self->cause, 2);
-
- /* 3GPP TS 24.011 ==> 8.2.5.3 RP-User data element */
- if(self->udata){
- static uint8_t iei = 0x41;
- tsk_buffer_append(output, &iei, 1); // IEI
- tsk_buffer_append(output, &self->udata->size, 1); // length-indicator
- tsk_buffer_append(output, self->udata->data, self->udata->size);
- }
- else{
- static uint8_t _1byte = 0x00;
- tsk_buffer_append(output, &_1byte, 1); // length-indicator
- }
-
- return 0;
+ /* don't need to test output and self --> already done by tsms_rpdu_message_serialize() */
+ const tsms_rpdu_error_t* self = (const tsms_rpdu_error_t*)_self;
+
+ /* 3GPP TS 24.011 ==> 8.2.2 Message type indicator (MTI) */
+ tsk_buffer_append(output, &_self->mti, 1);
+
+ /* 3GPP TS 24.011 ==> 8.2.3 Message reference */
+ tsk_buffer_append(output, &_self->mr, 1);
+
+ /* 3GPP TS 24.011 ==> 8.2.5.4 RP Cause
+ * Only 1 cause (LV)*/
+ tsk_buffer_append(output, self->cause, 2);
+
+ /* 3GPP TS 24.011 ==> 8.2.5.3 RP-User data element */
+ if(self->udata) {
+ static uint8_t iei = 0x41;
+ tsk_buffer_append(output, &iei, 1); // IEI
+ tsk_buffer_append(output, &self->udata->size, 1); // length-indicator
+ tsk_buffer_append(output, self->udata->data, self->udata->size);
+ }
+ else {
+ static uint8_t _1byte = 0x00;
+ tsk_buffer_append(output, &_1byte, 1); // length-indicator
+ }
+
+ return 0;
}
/**@ingroup tsms_rpdu_group
@@ -543,33 +540,33 @@ int _tsms_rpdu_rperror_serialize(const tsms_rpdu_message_t* _self, tsk_buffer_t*
*/
tsms_rpdu_error_t* tsms_rpdu_error_create(uint8_t mr, const tsms_tpdu_message_t* tpdu, uint8_t cause, tsk_bool_t MobOrig)
{
- tsms_rpdu_error_t* ret = tsk_null;
-
- /*if(!tpdu){
- TSK_DEBUG_WARN("TPDU for RP-ERROR message is Null.");
- }*/
-
- if(!(ret = tsk_object_new(tsms_rpdu_error_def_t))){
- goto bail;
- }
-
- /* 3GPP TS 24.011 ==> 8.2.2 Message type indicator (MTI) */
- TSMS_RPDU_MESSAGE(ret)->mti = MobOrig? tsms_rpdu_type_error_mo : tsms_rpdu_type_error_mt;
-
- /* 3GPP TS 24.011 ==> 8.2.3 Message reference */
- TSMS_RPDU_MESSAGE(ret)->mr = mr;
-
- /* 3GPP TS 24.011 ==> 8.2.5.4 RP Cause */
- ret->cause[0] = 1 /*len*/;
- ret->cause[1] = cause;
-
- /* 3GPP TS 24.011 ==> 8.2.5.3 RP-User data element */
- if(tpdu && (ret->udata = tsk_buffer_create_null())){
- tsms_tpdu_message_serialize(tpdu, ret->udata, MobOrig);
- }
+ tsms_rpdu_error_t* ret = tsk_null;
+
+ /*if(!tpdu){
+ TSK_DEBUG_WARN("TPDU for RP-ERROR message is Null.");
+ }*/
+
+ if(!(ret = tsk_object_new(tsms_rpdu_error_def_t))) {
+ goto bail;
+ }
+
+ /* 3GPP TS 24.011 ==> 8.2.2 Message type indicator (MTI) */
+ TSMS_RPDU_MESSAGE(ret)->mti = MobOrig? tsms_rpdu_type_error_mo : tsms_rpdu_type_error_mt;
+
+ /* 3GPP TS 24.011 ==> 8.2.3 Message reference */
+ TSMS_RPDU_MESSAGE(ret)->mr = mr;
+
+ /* 3GPP TS 24.011 ==> 8.2.5.4 RP Cause */
+ ret->cause[0] = 1 /*len*/;
+ ret->cause[1] = cause;
+
+ /* 3GPP TS 24.011 ==> 8.2.5.3 RP-User data element */
+ if(tpdu && (ret->udata = tsk_buffer_create_null())) {
+ tsms_tpdu_message_serialize(tpdu, ret->udata, MobOrig);
+ }
bail:
- return ret;
+ return ret;
}
//
@@ -577,35 +574,34 @@ bail:
//
static tsk_object_t* tsms_rpdu_error_ctor(tsk_object_t * self, va_list * app)
{
- tsms_rpdu_error_t *error = self;
- if(error){
- TSMS_RPDU_MESSAGE(error)->mti = tsms_rpdu_type_error_mo;
- }
- else{
- TSK_DEBUG_ERROR("Null");
- }
- return self;
+ tsms_rpdu_error_t *error = self;
+ if(error) {
+ TSMS_RPDU_MESSAGE(error)->mti = tsms_rpdu_type_error_mo;
+ }
+ else {
+ TSK_DEBUG_ERROR("Null");
+ }
+ return self;
}
static tsk_object_t* tsms_rpdu_error_dtor(tsk_object_t * self)
-{
- tsms_rpdu_error_t *error = self;
- if(error){
- TSK_OBJECT_SAFE_FREE(error->udata);
- }
- else{
- TSK_DEBUG_ERROR("Null");
- }
-
- return self;
+{
+ tsms_rpdu_error_t *error = self;
+ if(error) {
+ TSK_OBJECT_SAFE_FREE(error->udata);
+ }
+ else {
+ TSK_DEBUG_ERROR("Null");
+ }
+
+ return self;
}
-static const tsk_object_def_t tsms_rpdu_error_def_s =
-{
- sizeof(tsms_rpdu_error_t),
- tsms_rpdu_error_ctor,
- tsms_rpdu_error_dtor,
- tsk_null,
+static const tsk_object_def_t tsms_rpdu_error_def_s = {
+ sizeof(tsms_rpdu_error_t),
+ tsms_rpdu_error_ctor,
+ tsms_rpdu_error_dtor,
+ tsk_null,
};
const tsk_object_def_t *tsms_rpdu_error_def_t = &tsms_rpdu_error_def_s;
OpenPOWER on IntegriCloud