Como vemos las funciones build_tlv( ... )
y
destroy_tlv( ... )
permiten crear y destruir una lista
dinámica de parámetros, que es parte de algunos PDUs del
protocolo y que se denominan parámetros opcionales.
int build_tlv( tlv_t **dest, tlv_t *source ); int destroy_tlv( tlv_t *sourceList ); |
dest: es un puntero a una referencia a una estructura de tipo tlv_t. En el ejemplo que vemos más adelante se muestra el porque de esta doble referencia.
source: es un puntero a una estructura tlv_t.
sourceList: Este puntero es una
referencia a tlv_t. En la funcion destroy_tlv( ... )
el parámetro es una referencia a una lista linkeada.
El uso de parámetros opcionales esta limitado a un campo de tipo tlv_t que no existe en todas las estructuras de datos del PDU. Se muestra a continuación la forma en que debe manejarse estas estructuras.
#define TEXTO "mensaje de texto numero 01" : { submit_sm_t pdu; tlv_t tlv; memset(&tlv, 0, sizeof(tlv_t)); tlv.tag = TLVID_user_message_reference; /* tag present in submit_sm */ tlv.length = sizeof(uint16_t); tlv.value.val16 = 0x0024; /* valor */ build_tlv( &(pdu.tlv), &tlv ); /* value attached to main structure */ memset(&tlv, 0, sizeof(tlv_t)); tlv.tag = TLVID_more_messages_to_send; /* tag present in submit_sm */ tlv.length = sizeof(uint8_t); tlv.value.val8 = 0x24; /* valor */ build_tlv( &(pdu.tlv), &tlv ); /* value attached to main structure */ memset(&tlv, 0, sizeof(tlv_t)); tlv.tag = TLVID_message_payload; /* tag present in submit_sm */ tlv.length = strlen(TEXTO); memcpy(tlv.value.octet, TEXTO, tlv.length); /* valor */ build_tlv( &(pdu.tlv), &tlv ); /* value attached to main structure */ /* Pack and send data in pdu */ destroy_tlv( pdu.tlv ); /* Free pdu list */ } |