7. Manejo de parámetros opcionales

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 );
    
Donde:

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.

7.1. Ejemplo de uso

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 */
}