Saltar al contenido principal

Integración del Sistema de Carga en Línea (OCS)

Guía completa para la integración de OmniTAS con Sistemas de Carga en Línea a través de la interfaz Diameter Ro, incluyendo control de crédito en tiempo real, extracción de AVP y mapeo de variables de FreeSWITCH.

Tabla de Contenidos

Descripción General de la Arquitectura

OmniTAS implementa la interfaz Diameter Ro según 3GPP TS 32.299 para la carga en línea en tiempo real. El sistema autoriza llamadas solicitando crédito de un OCS antes de la configuración de la llamada, monitorea el crédito durante la llamada y reporta el uso final al finalizar.

Componentes Clave

Credit-Control-Request (CCR):

  • CCR-Initial (Tipo 1): Enviado antes de la configuración de la llamada para solicitar autorización de crédito inicial
  • CCR-Update (Tipo 2): Enviado durante llamadas activas para re-autorización o actualizaciones interinas
  • CCR-Terminate (Tipo 3): Enviado al finalizar la llamada con reporte de uso final

Credit-Control-Answer (CCA):

  • Contiene unidades de servicio concedidas (cuota de tiempo en segundos)
  • Incluye AVPs específicos del proveedor con datos de carga adicionales
  • Proporciona información de enrutamiento, detalles de la parte cargada e identificadores de servicio

Flujo de Control de Crédito

Secuencia de Autorización de Llamadas

Manejo de Agotamiento de Crédito

OmniTAS admite múltiples mecanismos para manejar el agotamiento de crédito, con integración automática entre colgados programados y anuncios de agotamiento de crédito.

Colgado Programado con Reprogramación Dinámica

Cuando schedule_hangup_auth está habilitado, OmniTAS programa un temporizador de FreeSWITCH que termina automáticamente las llamadas cuando el crédito concedido expira. Este temporizador se reprograma dinámicamente cada vez que se concede nuevo crédito a través de las respuestas CCR-Update.

Cómo funciona:

Lógica de Margen:

OmniTAS envía mensajes CCR-Update antes de que expire el crédito concedido para garantizar un servicio continuo. El tiempo de margen es configurable a través de ccr_update_buffer_seconds (predeterminado: 2 segundos).

Ejemplo de línea de tiempo:

  • T+0s: Llamada contestada, OCS concede 10s, temporizador programado para T+10s
  • T+8s: CCR-U enviado (10s - 2s de margen)
  • T+8.1s: OCS concede 10s, temporizador reprogramado a T+18.1s (10s desde ahora)
  • T+16.1s: CCR-U enviado
  • T+16.2s: OCS concede 10s, temporizador reprogramado a T+26.2s
  • La llamada continúa mientras OCS siga concediendo crédito

Registros a observar:

[OCS HANGUP RESCHEDULE] UUID encontrado <uuid> para la llamada <id> - reprogramando temporizador a 10s desde ahora
[SCHED TRANSFER] Programando transferencia al plan de marcado credit_exhausted para <uuid> en 10s
[OCS HANGUP RESCHEDULE] Temporizador reprogramado con éxito para la llamada <id> (UUID: <uuid>)

Integración: schedule_hangup_auth + credit_exhaustion_announcement

Cuando ambas funciones están habilitadas, OmniTAS utiliza automáticamente transferencias programadas en lugar de colgados directos, permitiendo que el llamante escuche un anuncio antes de la terminación de la llamada.

Sin anuncio configurado:

config :tas, :online_charging,
schedule_hangup_auth: true,
credit_exhaustion_announcement: nil

→ Utiliza sched_hangup - colgado directo cuando expira el crédito

Con anuncio configurado:

config :tas, :online_charging,
schedule_hangup_auth: true,
credit_exhaustion_announcement: "${base_dir}/sounds/en/us/callie/misc/8000/credit_exhausted.wav"

→ Utiliza sched_transfer - transfiere al plan de marcado credit_exhausted que reproduce el anuncio y luego cuelga

Cómo funciona la transferencia:

  1. OmniTAS establece la variable de canal tas_call_reason=credit_exhausted
  2. Programa la transferencia a la extensión credit_exhausted en el contexto del plan de marcado ims_as
  3. Cuando se activa el temporizador:
    • FreeSWITCH transfiere la A-leg al plan de marcado credit_exhausted
    • El puente se rompe automáticamente, la B-leg recibe BYE
    • El plan de marcado reproduce el anuncio a la A-leg
    • La llamada termina después del anuncio

Beneficios:

  • El llamante escucha un anuncio profesional en lugar de una desconexión abrupta
  • La B-leg (parte llamada) no escucha el anuncio
  • CCR-T aún se envía con el uso real
  • Ruta del anuncio: Debe ser relativa al directorio base de FreeSWITCH (usar la variable ${base_dir})

Agotamiento Inmediato de Crédito Durante CCR-Update

Si el OCS niega crédito o devuelve cero segundos durante un CCR-Update, OmniTAS activa inmediatamente el manejo de agotamiento de crédito, anulando cualquier temporizador programado.

Escenarios de Respuesta del OCS:

Códigos de Error Manejados:

Respuesta del OCSAcciónRegistros
{:ok, 0} (Cero segundos)Colgado inmediato por agotamiento de créditoCrédito agotado (cero segundos asignados) - activando colgado inmediato
{:error, 4012} (LIMITE_DE_CREDITO_ALCANZADO)Colgado inmediato por agotamiento de créditoCrédito agotado (4012 LIMITE_DE_CREDITO_ALCANZADO) - activando colgado inmediato
{:error, 4010} (SERVICIO_DENEGADO_AL_USUARIO_FINAL)Colgado inmediato por agotamiento de créditoServicio denegado (4010 SERVICIO_DENEGADO_AL_USUARIO_FINAL) - activando colgado inmediato
{:error, reason} (Otros errores)Detener trabajo CCR periódico, el temporizador programado se activaCCR periódico falló con error <reason> - Deteniendo trabajo
{:ok, N} donde N > 0Reprogramar temporizador a +N segundosCCA periódico asignó Ns, enviará el siguiente CCR-U en (N-buffer)s

Prioridad: El manejo inmediato del agotamiento de crédito gana sobre el temporizador programado. Si el OCS niega crédito en T+8s pero el temporizador estaba programado para T+10s, el colgado inmediato en T+8s ocurre y el temporizador programado se vuelve irrelevante.

Ejemplo de línea de tiempo con negación de crédito a mitad de llamada:

T+0s:   Llamada contestada
T+0.1s: OCS concede 10s → Temporizador programado para T+10.1s
T+8s: CCR-U enviado (margen = 2s)
T+8.1s: OCS devuelve 0 segundos → Transferencia inmediata al plan de marcado credit_exhausted
T+8.2s: Anuncio se reproduce al llamante
T+10s: Llamada terminada (temporizador programado irrelevante)

Registros para agotamiento inmediato de crédito:

[advertencia] Crédito agotado (cero segundos asignados) - activando colgado inmediato
[advertencia] Colgando la llamada <id> (UUID: <uuid>) debido a agotamiento de crédito
[info] Configuración de anuncio de agotamiento de crédito: "${base_dir}/sounds/..."
[info] Reproduciendo anuncio antes del colgado: ...
[info] Estableciendo tas_call_reason=credit_exhausted para <uuid>
[info] Transfiriendo al plan de marcado de crédito agotado: uuid_transfer <uuid> credit_exhausted XML ims_as

Resumen: Mecanismos de Agotamiento de Crédito

OmniTAS proporciona dos mecanismos complementarios:

  1. Temporizador Programado (schedule_hangup_auth):

    • Colgado/transferencia automática cuando expira el crédito concedido
    • Reprogramado dinámicamente en cada respuesta CCR-U
    • Utiliza lógica de margen para enviar CCR-U antes de la expiración
    • Se integra con la función de anuncio
  2. Manejo Inmediato de Agotamiento:

    • Activado cuando el OCS niega crédito durante CCR-U
    • Anula el temporizador programado
    • Soporta reproducción de anuncios
    • Maneja códigos de error específicos de Diameter

Ambos mecanismos respetan la configuración de credit_exhaustion_announcement y reproducirán el audio configurado antes de terminar las llamadas cuando esté configurado.

Análisis de AVP y Mapeo de Variables

Descripción General

OmniTAS extrae automáticamente los Pares Atributo-Valor (AVP) de los mensajes Credit-Control-Answer y los hace disponibles para FreeSWITCH como variables de canal. Esto permite que la lógica del plan de marcado utilice datos proporcionados por OCS para decisiones de enrutamiento, propósitos de facturación o tratamiento de llamadas.

Tipos de AVP Soportados:

  • Valores simples (UTF8String, Unsigned32, Integer32)
  • AVPs agrupados con estructuras anidadas
  • AVPs específicos del proveedor (por ejemplo, Información del Servicio 3GPP)

Convención de Nombres de Variables: Los AVPs se aplanan en variables de canal con notación de puntos y el prefijo CCA:

CCA.<Nombre-AVP>.<Nombre-AVP-Anidado>.<Nombre-AVP-Valor> = "valor"

Mapeos Comunes de AVP

AVP de Información del Servicio (3GPP)

El AVP agrupado de Información del Servicio (Código AVP 873, Vendor-ID 10415) contiene detalles de carga específicos de IMS:

Ejemplo de Respuesta del OCS:

Información del Servicio
├── Información-IMS
│ ├── Información de Enrutamiento de Selección de Transportista: "1408"
│ └── Funcionalidad del Nodo: 6
└── Dirección de Parte Cargada Alternativa: "NickTest"

Variables de FreeSWITCH Resultantes:

CCA.Service-Information.Carrier-Select-Routing-Information = "1408"
CCA.Service-Information.Alternate-Charged-Party-Address = "NickTest"

Accediendo en el Plan de Marcado: Las variables utilizan notación de puntos y guiones como se muestra arriba:

<action application="log" data="INFO Transportista: ${CCA.Service-Information.Carrier-Select-Routing-Information}"/>

Visualizando con uuid_dump: En la consola de FreeSWITCH o ESL, las variables aparecen con el prefijo variable_:

variable_CCA.Service-Information.Carrier-Select-Routing-Information: 1408
variable_CCA.Service-Information.Alternate-Charged-Party-Address: NickTest

Nota: FreeSWITCH preserva puntos y guiones en los nombres de las variables. Las variables funcionan en todos los contextos y aplicaciones del plan de marcado.

AVP de Unidad de Servicio Concedida

Las cuotas de tiempo se extraen y se hacen disponibles:

Respuesta del OCS:

Unidad de Servicio Concedida
└── CC-Time: 600

Variable:

allocated_time = 600

Lógica de Procesamiento de AVP

Reglas de Procesamiento:

  1. AVPs Agrupados añaden un nivel a la jerarquía del nombre de la variable pero no tienen valor en sí mismos
  2. AVPs Simples se mapean a variables con su ruta completa con puntos
  3. AVPs Específicos del Proveedor se procesan de manera idéntica a los AVPs estándar
  4. AVPs Desconocidos se omiten de manera segura sin errores

Ejemplo: Anidamiento Multinivel

Estructura CCA del OCS:

Información del Servicio (Agrupado)
├── Información-IMS (Agrupado)
│ ├── Funcionalidad del Nodo: 6
│ ├── Rol del Nodo: 1
│ ├── Dirección de Parte Llamadora: "tel:+313380000000670"
│ └── Tiempos (Agrupado)
│ ├── Marca de Tiempo de Solicitud SIP: "2026-01-24T22:40:18Z"
│ └── Marca de Tiempo de Respuesta SIP: "2026-01-24T22:40:18Z"
└── Información-IN (Agrupado)
└── Número Llamado Real: "24724741234"

Variables de FreeSWITCH Creadas:

CCA.Service-Information.IMS-Information.Node-Functionality = "6"
CCA.Service-Information.IMS-Information.Role-Of-Node = "1"
CCA.Service-Information.IMS-Information.Calling-Party-Address = "tel:+313380000000670"
CCA.Service-Information.IMS-Information.Time-Stamps.SIP-Request-Timestamp = "2026-01-24T22:40:18Z"
CCA.Service-Information.IMS-Information.Time-Stamps.SIP-Response-Timestamp = "2026-01-24T22:40:18Z"
CCA.Service-Information.IN-Information.Real-Called-Number = "24724741234"

Configuración

Parámetros de Carga en Línea

ParámetroTipoRequeridoPredeterminadoDescripción
enabledBooleanoNofalseHabilitar la integración de carga en línea. Cuando false, todas las llamadas omiten la autorización de OCS.
periodic_ccr_time_secondsEnteroNo60Intervalo en segundos entre mensajes CCR-Update durante llamadas activas. No se utiliza cuando schedule_hangup_auth está habilitado (temporización dinámica basada en el crédito concedido). Rango recomendado: 30-300 segundos para modo legado.
ccr_update_buffer_secondsEnteroNo2Margen de seguridad en segundos antes de que expire el crédito al enviar CCR-Update. OmniTAS envía CCR-U en (allocated_time - buffer) para garantizar que el crédito se extienda antes de la expiración. Recomendado: 2-5 segundos.
schedule_hangup_authBooleanoNofalseHabilitar colgado/transferencia automática de llamadas cuando expira el crédito concedido. Cuando true, OmniTAS programa un temporizador de FreeSWITCH basado en allocated_time de cada CCA y se reprograma dinámicamente en cada respuesta CCR-U. Funciona con credit_exhaustion_announcement.
credit_exhaustion_announcementCadenaNonilRuta del archivo de audio para el anuncio de agotamiento de crédito. Cuando se configura con schedule_hangup_auth, utiliza transferencia programada para reproducir el anuncio antes del colgado. Cuando se configura solo (sin schedule_hangup_auth), reproduce el anuncio solo en el agotamiento inmediato de crédito. La ruta debe usar la variable de FreeSWITCH: "${base_dir}/sounds/...". Establecer en nil para colgar directamente sin anuncio.
skipped_regexLista[String]No[]Lista de patrones regex para números de destino que omiten OCS. Útil para números de emergencia (por ejemplo, "^911$", "^000$").

Parámetros de Conexión Diameter

ParámetroTipoRequeridoPredeterminadoDescripción
origin_hostCadena-Identidad Diameter de OmniTAS (FQDN). Debe ser única en su red Diameter. Ejemplo: "tas01.epc.mnc123.mcc456.3gppnetwork.org".
origin_realmCadena-Reino Diameter de OmniTAS. Utilizado para decisiones de enrutamiento. Ejemplo: "epc.mnc123.mcc456.3gppnetwork.org".
destination_realmCadena-Reino Diameter de OCS. Las solicitudes se enrutan a pares en este reino.
destination_hostCadenaNonilIdentidad Diameter específica de OCS. Cuando nil, el enrutamiento se basa solo en destination_realm. Usar cuando se requiere enrutamiento directo a una instancia específica de OCS.

Ejemplo de Configuración

config :tas, :online_charging,
# Habilitar carga en línea
enabled: true,

# Enviar CCR-Update cada 60 segundos
periodic_ccr_time_seconds: 60,

# Programar colgado basado en crédito concedido
schedule_hangup_auth: true,

# Reproducir anuncio antes del colgado por agotamiento de crédito
credit_exhaustion_announcement: "ivr/ivr-account_balance_low.wav",

# Omitir OCS para llamadas de emergencia y buzón de voz
skipped_regex: [
"^911$", # Emergencia (EE.UU.)
"^000$", # Emergencia (AU)
"^\*86$" # Acceso al buzón de voz
]

config :tas, :diameter,
# Identidad del servicio
origin_host: "tas01.epc.mnc380.mcc313.3gppnetwork.org",
origin_realm: "epc.mnc380.mcc313.3gppnetwork.org",

# Enrutamiento OCS
destination_realm: "epc.mnc380.mcc313.3gppnetwork.org",
destination_host: nil # Enrutamiento basado en reino

Cómo funciona:

Cuando se recibe una llamada:

  1. El número de destino se verifica contra los patrones skipped_regex
  2. Si coincide, la llamada omite OCS (útil para servicios de emergencia)
  3. Si no coincide, se envía CCR-Initial a OCS en destination_realm
  4. Se analiza la respuesta CCA para unidades concedidas y AVPs
  5. Los AVPs se mapean a variables de FreeSWITCH (ver Mapeo de AVP)
  6. La llamada procede con allocated_time y datos de AVP disponibles
  7. Se envía CCR-Update cada periodic_ccr_time_seconds durante la llamada
  8. Si schedule_hangup_auth está habilitado, colgado automático cuando expira el crédito
  9. Se envía CCR-Terminate al completar la llamada

Casos de uso:

  • OCS Básico: Habilitar con valores predeterminados para control de crédito estándar
  • Llamadas de alto valor: Reducir periodic_ccr_time_seconds a 30s para re-autenticaciones frecuentes
  • Servicio Prepagado: Habilitar schedule_hangup_auth y establecer credit_exhaustion_announcement
  • Cumplimiento de Emergencias: Agregar números de emergencia a skipped_regex para garantizar que siempre estén conectados

Integración con FreeSWITCH

Accediendo a Variables AVP en el Plan de Marcado

Los datos AVP extraídos de los mensajes CCA están disponibles como variables de canal en el plan de marcado de FreeSWITCH:

<extension name="Ruta_con_Datos_OCS">
<condition field="destination_number" expression="^(.+)$">

<!-- Acceder a la información de enrutamiento del transportista de OCS -->
<action application="log"
data="INFO Código del Transportista: ${CCA.Service-Information.Carrier-Select-Routing-Information}"/>

<!-- Acceder a la parte cargada de OCS -->
<action application="log"
data="INFO Parte Cargada: ${CCA.Service-Information.Alternate-Charged-Party-Address}"/>

<!-- Acceder al tiempo concedido -->
<action application="log"
data="INFO Tiempo Asignado: ${allocated_time} segundos"/>

<!-- Enrutamiento basado en el código del transportista -->
<action application="set"
data="carrier_code=${CCA.Service-Information.Carrier-Select-Routing-Information}"/>
<action application="bridge"
data="sofia/external/$1@carrier-${carrier_code}.sip.example.com"/>

</condition>
</extension>

Disponibilidad de Variables

Temporización:

  • Las variables se establecen antes de la configuración de la llamada en FreeSWITCH
  • Disponibles durante toda la duración de la llamada
  • Persisten a través de transferencias y actualizaciones de llamadas

Alcance:

  • Alcance específico del canal (específico para cada pierna de llamada individual)
  • No heredado por piernas transferidas/puenteadas
  • Seguro de usar en todas las aplicaciones del plan de marcado

Ejemplos de Casos de Uso

1. Selección de Transportista Basada en Datos de OCS

Utilizar el código del transportista proporcionado por OCS para enrutar llamadas:

<extension name="Seleccion_de_Transportista">
<condition field="${CCA.Service-Information.Carrier-Select-Routing-Information}" expression="^(.+)$">
<action application="bridge"
data="sofia/external/${destination_number}@carrier-$1.example.com"/>
</condition>

<!-- Recaída si no se especifica transportista -->
<condition field="${CCA.Service-Information.Carrier-Select-Routing-Information}" expression="^$">
<action application="bridge"
data="sofia/external/${destination_number}@default-carrier.example.com"/>
</condition>
</extension>

Cómo funciona: OCS devuelve el código del transportista "1408" en el AVP de Información del Servicio. FreeSWITCH enruta la llamada al gateway carrier-1408.example.com basado en estos datos.

2. Parte de Facturación Alternativa

Enrutar la facturación a una parte diferente basada en la respuesta de OCS:

<extension name="Facturación_Alternativa">
<condition field="${CCA.Service-Information.Alternate-Charged-Party-Address}" expression="^(.+)$">

<!-- Registrar parte de facturación para CDRs -->
<action application="set"
data="billed_party=$1"/>
<action application="export"
data="billed_party=$1"/>

<!-- Incluir en encabezados SIP -->
<action application="set"
data="sip_h_X-Billed-Party=$1"/>

<action application="bridge"
data="sofia/external/${destination_number}@trunk.example.com"/>
</condition>
</extension>

Cómo funciona: OCS especifica la parte cargada alternativa (por ejemplo, cuenta corporativa). OmniTAS extrae "NickTest" del AVP y lo hace disponible para el plan de marcado para grabación de CDR y inserción de encabezados SIP.

3. Llamadas Limitadas en el Tiempo con Advertencias

Proporcionar advertencias antes de que expire el crédito:

<extension name="Advertencias_de_Crédito">
<condition field="destination_number" expression="^(.+)$">

<!-- Programar advertencia 30 segundos antes del colgado -->
<action application="set"
data="warning_time=${expr(${allocated_time} - 30)}"/>

<action application="sched_hangup"
data="+${allocated_time} ALLOTTED_TIMEOUT"/>

<action application="sched_broadcast"
data="+${warning_time} playback::ivr/ivr-account_balance_low.wav"/>

<action application="bridge"
data="sofia/external/$1@trunk.example.com"/>
</condition>
</extension>

Cómo funciona: Utiliza allocated_time de OCS para programar un colgado automático y reproduce un anuncio de advertencia 30 segundos antes de la desconexión.

Mensajes Diameter

CCR-Initial (Tipo de Solicitud 1)

Enviado antes de la configuración de la llamada para solicitar autorización y asignación inicial de crédito.

AVPs Clave Enviados:

AVPCódigoTipoDescripción
Session-Id263UTF8StringIdentificador de sesión único: <origin_host>;<timestamp>;<random>
Auth-Application-Id258Unsigned32Valor 4 para la Aplicación de Control de Crédito Diameter según RFC 4006
Service-Context-Id461UTF8String"000.000.12.32260@3gpp.org" para carga IMS según TS 32.299
CC-Request-Type416EnumeradoValor 1 (INITIAL_REQUEST)
CC-Request-Number415Unsigned32Número de secuencia, comienza en 1
Subscription-Id443AgrupadoMSISDN o IMSI del suscriptor
Requested-Service-Unit437AgrupadoCrédito solicitado (tiempo o unidades)
Service-Information873AgrupadoDetalles de llamada específicos de IMS (parte llamante/llamada, marcas de tiempo)

Ejemplo CCR-I:

Session-Id: "tas01.example.org;1769294418268;8a078232"
Auth-Application-Id: 4
CC-Request-Type: 1 (INITIAL_REQUEST)
CC-Request-Number: 1
Subscription-Id:
- Subscription-ID-Type: 0 (END_USER_E164)
Subscription-ID-Data: "313380000000670"
Requested-Service-Unit:
- CC-Time: 0 (Solicitar máximo disponible)
Service-Information:
- Información-IMS:
- Dirección-de-Parte-Llamadora: "tel:+313380000000670"
- Dirección-de-Parte-Llamada: "tel:+24724741234"
- Funcionalidad del Nodo: 6 (AS)

CCA (Credit-Control-Answer)

Respuesta del OCS con la decisión de autorización y el crédito concedido.

AVPs Clave Recibidos:

AVPCódigoTipoDescripción
Result-Code268Unsigned322001 para éxito. Ver Códigos de Resultado para valores de error.
Granted-Service-Unit431AgrupadoCrédito asignado (tiempo en segundos)
Service-Information873AgrupadoDatos de carga adicionales (información del transportista, parte cargada, etc.)

Ejemplo CCA con AVPs:

Session-Id: "tas01.example.org;1769294418268;8a078232"
Result-Code: 2001 (DIAMETER_SUCCESS)
CC-Request-Type: 1
CC-Request-Number: 1
Granted-Service-Unit:
- CC-Time: 600 (10 minutos concedidos)
Service-Information:
- Información-IMS:
- Información de Enrutamiento de Selección de Transportista: "1408"
- Dirección de Parte Cargada Alternativa: "NickTest"

Variables Resultantes:

allocated_time = 600
CCA.Service-Information.Carrier-Select-Routing-Information = "1408"
CCA.Service-Information.Alternate-Charged-Party-Address = "NickTest"

CCR-Update (Tipo de Solicitud 2)

Enviado durante llamadas activas para re-autorización periódica o reporte de uso interino.

Cuándo se Envía:

  • Cada periodic_ccr_time_seconds (predeterminado: 60s)
  • Al contestar la llamada (transición de configuración a activa)
  • Cuando se activa explícitamente (por ejemplo, cambio de servicio)

Diferencias Clave con CCR-I:

  • CC-Request-Type: 2 (UPDATE_REQUEST)
  • CC-Request-Number: Se incrementa con cada actualización
  • Used-Service-Unit: Uso reportado desde la última solicitud
  • Requested-Service-Unit: Crédito adicional solicitado

CCR-Terminate (Tipo de Solicitud 3)

Enviado al finalizar la llamada con reporte de uso final.

AVPs Clave:

  • CC-Request-Type: 3 (TERMINATION_REQUEST)
  • Used-Service-Unit: Duración total de la llamada
  • Termination-Cause: Razón para el final de la sesión

Códigos de Resultado

CódigoNombreDescripciónAcción de OmniTAS
2001DIAMETER_SUCCESSSolicitud aprobadaAnalizar AVPs, configurar llamada
4010DIAMETER_END_USER_SERVICE_DENIEDServicio denegado para el suscriptorRechazar llamada con CALL_REJECTED
4012DIAMETER_CREDIT_LIMIT_REACHEDCrédito insuficienteRechazar llamada con OUTGOING_CALL_BARRED
5003DIAMETER_AUTHORIZATION_REJECTEDPolítica de OCS denegadaRechazar llamada con CALL_REJECTED
5xxxFallos permanentesError de configuración o sistema de OCSRechazar llamada, registrar error

Referencia: RFC 6733 §7.1 y 3GPP TS 32.299

Métricas

Métricas de Solicitud Diameter

Métrica: diameter_requests_total Tipo: Contador Descripción: Total de solicitudes Diameter enviadas por la aplicación y tipo de solicitud Etiquetas:

  • application - Aplicación Diameter: ro (carga en línea)
  • command - Tipo de solicitud: ccr
  • status - Resultado: success, error, timeout

Ejemplos de consultas:

# Tasa de éxito de CCR
sum(rate(diameter_requests_total{application="ro",command="ccr",status="success"}[5m]))
/ sum(rate(diameter_requests_total{application="ro",command="ccr"}[5m]))

# Tasa de timeout de CCR
rate(diameter_requests_total{application="ro",command="ccr",status="timeout"}[5m])

Métricas de Respuesta Diameter

Métrica: diameter_responses_total Tipo: Contador Descripción: Respuestas Diameter recibidas por código de resultado Etiquetas:

  • application - ro
  • command - ccr
  • result_code - Código de resultado Diameter (2001, 4012, etc.)

Ejemplos de consultas:

# Respuestas por código de resultado
sum by (result_code) (rate(diameter_responses_total{application="ro"}[5m]))

# Rechazos de límite de crédito (4012)
rate(diameter_responses_total{application="ro",result_code="4012"}[5m])

Métricas de Autorización OCS

Métrica: ocs_authorizations_total Tipo: Contador Descripción: Intentos de autorización OCS y resultados Etiquetas:

  • result - success, nocredit, timeout, error
  • skipped - true si se omite a través de regex, false de lo contrario

Ejemplos de consultas:

# Tasa de éxito de autorización (excluyendo omitidos)
sum(rate(ocs_authorizations_total{result="success",skipped="false"}[5m]))
/ sum(rate(ocs_authorizations_total{skipped="false"}[5m]))

# Rechazos sin crédito
rate(ocs_authorizations_total{result="nocredit"}[5m])

Métricas de Duración Diameter

Métrica: diameter_request_duration_seconds Tipo: Histograma Descripción: Tiempo de ida y vuelta de la solicitud Diameter Etiquetas:

  • application - ro
  • command - ccr
  • status - success, error, timeout

Ejemplos de consultas:

# Percentil 95 de latencia CCR
histogram_quantile(0.95,
sum(rate(diameter_request_duration_seconds_bucket{application="ro"}[5m])) by (le)
)

# Latencia promedio por estado
avg(rate(diameter_request_duration_seconds_sum{application="ro"}[5m]))
by (status)
/ avg(rate(diameter_request_duration_seconds_count{application="ro"}[5m]))
by (status)

Solución de Problemas

Variables AVP No Disponibles en FreeSWITCH

Síntomas:

  • El plan de marcado de FreeSWITCH no puede acceder a ${CCA.Service-Information.*} variables
  • Las variables aparecen como vacías o indefinidas

Causas posibles:

  1. OCS no devuelve AVPs de Información del Servicio en CCA
  2. Fallo en el análisis de AVP debido a una estructura inesperada
  3. Variables no exportadas al canal de FreeSWITCH

Resolución:

  1. Verificar que la Respuesta del OCS Contenga AVPs

    Verifique los registros de OmniTAS para el mensaje CCA:

    [debug] Respuesta de Control de Crédito: {:diameter_packet, ...}
    [debug] Variables AVP analizadas: %{
    "CCA.Service-Information.Carrier-Select-Routing-Information" => "1408",
    "CCA.Service-Information.Alternate-Charged-Party-Address" => "NickTest"
    }

    Si "Variables AVP analizadas" está vacía %{}, OCS no está devolviendo los AVPs esperados.

  2. Verificar Errores de Análisis de AVP

    Busque advertencias en los registros:

    [advertencia] obtuve otro tipo de respuesta: {...}

    Esto indica que la estructura de AVP no coincide con el formato esperado. Verifique la estructura del paquete Diameter.

  3. Verificar Exportación de Variables de FreeSWITCH

    En la consola de FreeSWITCH o ESL:

    freeswitch> uuid_dump <call-uuid>

    Busque variables con el prefijo variable_ y CCA. en el nombre:

    variable_CCA.Service-Information.Carrier-Select-Routing-Information: 1408
    variable_CCA.Service-Information.Alternate-Charged-Party-Address: NickTest

    Nota: FreeSWITCH preserva puntos y guiones en los nombres de las variables. Funcionan correctamente en el plan de marcado:

    <action application="log" data="Transportista: ${CCA.Service-Information.Carrier-Select-Routing-Information}"/>

Llamada Rechazada con Error "no manejado"

Síntomas:

  • Los registros muestran: [advertencia] No se pudo autorizar la llamada: :no manejado
  • Respuestas CCA válidas (Código de Resultado 2001) son rechazadas
  • Las llamadas fallan a pesar de que OCS las aprueba

Causas posibles:

  • La estructura del mensaje CCA no coincide con el patrón esperado
  • AVPs específicos del proveedor en posiciones inesperadas
  • Desajuste en el índice de posición de AVP

Resolución:

Este fue un problema conocido solucionado en versiones recientes. Asegúrese de estar ejecutando la versión actual.

Comportamiento anterior: El emparejamiento de patrones requería:

  • AVP de Unidad de Servicio Concedida en la posición 7 exactamente
  • Lista de AVP específica del proveedor vacía []

Comportamiento actual: El emparejamiento de patrones acepta:

  • AVP de Unidad de Servicio Concedida en cualquier posición
  • Listas de AVP específicas del proveedor no vacías

Si el problema persiste:

  1. Capture la estructura del paquete CCA de los registros
  2. Verifique si los AVPs están en el formato Diameter esperado
  3. Verifique que el Código de Resultado sea 2001

Timeout del OCS en Todas las Solicitudes

Síntomas:

  • Todas las solicitudes CCR agotan el tiempo
  • Los registros muestran: [debug] Recibí respuesta para autorizar: {:error, :timeout}
  • No se recibió CCA dentro de los 5 segundos

Causas posibles:

  • Conectividad de red con OCS/DRA
  • Firewall bloqueando el puerto Diameter (3868)
  • destination_realm o destination_host incorrectos
  • OCS no responde a las solicitudes

Resolución:

  1. Verificar Conectividad de Red

    Pruebe la conexión TCP con OCS:

    telnet ocs.example.com 3868

    Debería conectarse con éxito. Si la conexión es rechazada o agota el tiempo, verifique las reglas del firewall.

  2. Verificar Configuración Diameter

    Verifique que destination_realm coincida con la configuración de OCS:

    config :tas, :diameter,
    destination_realm: "epc.mnc380.mcc313.3gppnetwork.org" # Debe coincidir con el reino de OCS
  3. Revisar Registros del OCS

    Verifique OCS para mensajes CCR entrantes. Si OCS recibe solicitudes pero no responde:

    • Verifique que OmniTAS origin_host sea reconocido por OCS
    • Verifique que la configuración del par OCS permita conexiones desde OmniTAS
    • Verifique que el Service-Context-Id y el Application-Id coincidan con las expectativas de OCS

Agotamiento de Crédito No Cuelga Llamadas

Síntomas:

  • Las llamadas continúan más allá del tiempo de crédito concedido
  • No hay colgado automático cuando expira allocated_time
  • schedule_hangup_auth habilitado pero no funciona

Causas posibles:

  • Colgado programado de FreeSWITCH no configurado
  • schedule_hangup_auth es false
  • Estado de la llamada no rastreado correctamente

Resolución:

  1. Verificar Configuración

    Asegúrese de que schedule_hangup_auth esté habilitado:

    config :tas, :online_charging,
    schedule_hangup_auth: true
  2. Verificar Conexión ESL de FreeSWITCH

    Verifique que OmniTAS pueda enviar comandos a FreeSWITCH:

    [debug] Respuesta de Programación de Colgado: {:ok, "+OK"}

    Si hay un error o no hay respuesta, verifique la configuración del Socket de Evento de FreeSWITCH.

  3. Monitorear Estado de la Llamada

    Verifique que el UUID de la llamada esté rastreado en el estado de la llamada:

    [debug] Estableciendo Colgado Programado para la llamada en 600 segundos

    Si el UUID no se encuentra, puede haber problemas con el rastreo del estado de la llamada.

Regex Omitido No Omite OCS

Síntomas:

  • Las llamadas de emergencia (911, 000) aún pasan por la autorización de OCS
  • Los números que coinciden con los patrones skipped_regex no se omiten
  • Retrasos en llamadas de emergencia

Causas posibles:

  • Error de sintaxis en el patrón regex
  • Desajuste en el formato del número de destino
  • Regex no escapado correctamente

Resolución:

  1. Verificar Patrones Regex

    Pruebe la compilación de regex:

    Regex.compile("^911$")  # Debería devolver {:ok, ~r/^911$/}

    Errores comunes:

    • Anclas faltantes: Use ^911$ no 911
    • Escape: Use \* para asterisco literal, no \*
  2. Verificar Formato del Número

    Verifique que el formato del número de destino coincida con el patrón:

    [debug] Verificando si el número marcado "911" coincide con regex omitido...

    Si el número está formateado como "+1911" pero el patrón es "^911$", no coincidirá.

  3. Patrones de Ejemplo

    config :tas, :online_charging,
    skipped_regex: [
    "^911$", # Emergencia (EE.UU.)
    "^000$", # Emergencia (AU)
    "^112$", # Emergencia Internacional
    "^\*86$", # Buzón de voz (asterisco escapado)
    "^1?800\d{7}$" # Números gratuitos
    ]

Referencia

Especificaciones 3GPP

EspecificaciónTítuloSecciones Relevantes
TS 32.299Aplicaciones de carga Diameter§6.3 (interfaz Ro), §7.2 (definiciones de AVP)
TS 32.240Arquitectura y principios de carga§5 (Carga en línea)
TS 29.229Interfaces Cx y DxUso de AVP de Información del Servicio en IMS

RFCs de IETF

RFCTítuloSecciones Relevantes
RFC 6733Protocolo Base Diameter§3 (Descripción general del protocolo), §7 (Manejo de errores)
RFC 4006Aplicación de Control de Crédito Diameter§8 (Mensajes de Control de Crédito)

Referencia de Códigos AVP

AVPs comunes utilizados en la integración de OCS:

Nombre de AVPCódigoVendor-IDTipoDescripción
Session-Id2630UTF8StringIdentificador de sesión único
Auth-Application-Id2580Unsigned32ID de aplicación Diameter (4 para CC)
CC-Request-Type4160Enumerado1=Inicial, 2=Actualizar, 3=Terminar
CC-Request-Number4150Unsigned32Número de secuencia
Result-Code2680Unsigned32Resultado de la solicitud (2001=éxito)
Granted-Service-Unit4310AgrupadoCrédito asignado
CC-Time4200Unsigned32Cuota de tiempo en segundos
Service-Information87310415AgrupadoDatos específicos del servicio 3GPP
IMS-Information87610415AgrupadoInformación de carga IMS
Carrier-Select-Routing-Information202310415UTF8StringCódigo de enrutamiento del transportista
Alternate-Charged-Party-Address128010415UTF8StringIdentificador de parte de facturación

Vendor-ID 10415 = 3GPP

Variables de Canal de FreeSWITCH

Todos los datos AVP extraídos están disponibles como variables de canal de FreeSWITCH:

Nombre de VariableFuenteValor de EjemploDescripción
${allocated_time}Unidad de Servicio Concedida / CC-Time600Tiempo asignado en segundos
${CCA.Session-Id}AVP de Session-Idomni-as01.epc...;1769299669873;325e2f2eIdentificador de sesión Diameter
${CCA.Result-Code}AVP de Result-Code2001Resultado de CCA (2001 = éxito)
${CCA.Auth-Application-Id}AVP de Auth-Application-Id4Aplicación Diameter (4 = CC)
${CCA.CC-Request-Type}AVP de CC-Request-Type1Tipo de solicitud (1=Inicial)
${CCA.CC-Request-Number}AVP de CC-Request-Number1Número de secuencia
${CCA.CC-Time}AVP de CC-Time (si está presente)600Cuota de tiempo concedida
${CCA.Origin-Host}AVP de Origin-Hostocs01.epc.mnc380.mcc313.3gppnetwork.orgIdentificador del host OCS
${CCA.Origin-Realm}AVP de Origin-Realmepc.mnc380.mcc313.3gppnetwork.orgReino OCS
${CCA.Service-Information.Carrier-Select-Routing-Information}Service-Information → Carrier-Select-Routing-Information1408Código de enrutamiento del transportista de OCS
${CCA.Service-Information.Alternate-Charged-Party-Address}Service-Information → Alternate-Charged-Party-AddressNickTestParte de facturación alternativa

Formato de Variable:

  • Todos los AVPs de CCA utilizan el prefijo CCA.
  • Los AVPs anidados utilizan notación de puntos: CCA.Padre.Hijo
  • Se preservan puntos y guiones en los nombres de las variables
  • En uuid_dump, las variables aparecen con el prefijo variable_

Ejemplo de salida de uuid_dump:

variable_allocated_time: 600
variable_CCA.Service-Information.Carrier-Select-Routing-Information: 1408
variable_CCA.Service-Information.Alternate-Charged-Party-Address: NickTest
variable_CCA.Result-Code: 2001