Carga en Línea por Diámetro (Interfaz Gy/Ro)
Interfaz del Sistema de Carga en Línea (OCS)
Tabla de Contenidos
- Descripción General
- Arquitectura de Carga 3GPP
- Conceptos Básicos de la Interfaz Gy/Ro
- Mensajes de Control de Crédito
- Flujos de Carga en Línea
- Control de Carga de Portadora
- Control de Crédito para Múltiples Servicios
- Configuración
- Flujos de Mensajes
- Manejo de Errores
- Integración con Gx
- Solución de Problemas
Descripción General
La interfaz Gy (también llamada interfaz Ro en contextos IMS) conecta PGW-C al Sistema de Carga en Línea (OCS) para el control de crédito en tiempo real. Esto permite:
- Carga Prepagada - Autorización y deducción de crédito en tiempo real
- Control de Crédito en Tiempo Real - Otorgar cuota antes de la entrega del servicio
- Carga Basada en Servicios - Diferente carga para voz, datos, SMS, etc.
- Actualizaciones Inmediatas de Cuenta - Actualizaciones del saldo de crédito en tiempo real
- Negación de Servicio - Bloquear el servicio cuando se agota el crédito
Carga en Línea vs. Carga Fuera de Línea
| Aspecto | Carga en Línea (Gy/Ro) | Carga Fuera de Línea (Gz/Rf) |
|---|---|---|
| Tiempo | En tiempo real, antes del servicio | Después de la entrega del servicio |
| Caso de Uso | Suscriptores prepagados | Suscriptores postpagados |
| Verificación de Crédito | Sí, antes de otorgar el servicio | No, la factura se genera más tarde |
| Sistema | OCS (Sistema de Carga en Línea) | CGF/CDF (Función de Datos de Carga) |
| Riesgo | Sin pérdida de ingresos | Riesgo de facturas impagas |
| Complejidad | Alta (requisitos en tiempo real) | Menor (procesamiento por lotes) |
| Impacto en el Usuario | Servicio denegado si no hay crédito | Servicio siempre disponible |
Ver también: Formato de CDR de Datos para registros de carga fuera de línea (facturación postpaga)
Ver también: Gestión de Sesiones para el ciclo de vida completo de la sesión PDN, incluida la integración de carga
Gy en la Arquitectura de Red
Funciones Clave
| Función | Descripción |
|---|---|
| Autorización de Crédito | Solicitar cuota al OCS antes de permitir el tráfico |
| Gestión de Cuotas | Rastrear unidades otorgadas (bytes, tiempo, eventos) |
| Detección de Agotamiento de Crédito | Monitorear la cuota restante |
| Re-autorización | Solicitar cuota adicional cuando se alcanza el umbral |
| Terminación del Servicio | Detener el servicio cuando se agota el crédito |
| Liquidación Final | Reportar el uso real al finalizar la sesión |
Arquitectura de Carga 3GPP
Puntos de Referencia de Carga
Función de Activación de Carga (CTF)
PGW-C actúa como un CTF (Función de Activación de Carga), responsable de:
- Detectar eventos cobrables - Inicio de sesión, uso de datos, fin de sesión
- Solicitar autorización de crédito - Antes de permitir el servicio
- Rastrear el consumo de cuotas - Monitorear unidades otorgadas
- Generar eventos de carga - Activar solicitudes de crédito
- Hacer cumplir el control de crédito - Bloquear tráfico cuando se agota la cuota
Función de Carga en Línea (OCF)
El OCS implementa la OCF (Función de Carga en Línea):
- Gestión del saldo de cuentas - Rastrear el crédito del suscriptor
- Tarificación - Determinar el precio por unidad (por MB, por segundo, etc.)
- Reserva de crédito - Reservar crédito para la cuota otorgada
- Deducción de crédito - Deducir al informar el uso
- Decisiones de política - Otorgar o denegar según el saldo
Conceptos Básicos de la Interfaz Gy/Ro
Referencia 3GPP
- Especificación: 3GPP TS 32.299 (Arquitectura de carga)
- Protocolo: 3GPP TS 32.251 (Carga en el dominio PS)
- ID de Aplicación de Diámetro: 4 (Gy/Ro - Aplicación de Control de Crédito)
- Protocolo Base: RFC 4006 (Aplicación de Control de Crédito de Diámetro)
Concepto de Sesión
Cada conexión PDN de UE que requiere carga en línea tiene una sesión Gy/Ro identificada por un Session-ID. Esta sesión:
- Se crea cuando la portadora requiere carga en línea (CCR-Initial)
- Se actualiza cuando se consume la cuota (CCR-Update)
- Se termina cuando finaliza la sesión (CCR-Termination)
Formato del ID de Sesión
Session-ID: <Origin-Host>;<high32>;<low32>[;<optional>]
Ejemplo: omni-pgw_c.epc.mnc999.mcc999.3gppnetwork.org;9876543210;12345;gy
Componentes:
- Origin-Host: Identidad de Diámetro de PGW-C
- high32: 32 bits altos del identificador único
- low32: 32 bits bajos del identificador único
- optional: Identificador adicional (por ejemplo, "gy" para distinguir de Gx)
Mensajes de Control de Crédito
Tipos de Mensajes
CCR-Initial (Solicitud de Control de Crédito - Inicial)
Cuando: UE crea una conexión PDN y la portadora requiere carga en línea
Propósito:
- Solicitar autorización de crédito inicial al OCS
- Reservar cuota para la entrega del servicio
- Establecer sesión Gy/Ro
AVPs Clave Enviados por PGW-C:
| Nombre de AVP | Código de AVP | Tipo | Descripción |
|---|---|---|---|
| Session-Id | 263 | UTF8String | Identificador único de sesión Gy |
| Auth-Application-Id | 258 | Unsigned32 | 4 (Control de Crédito) |
| Origin-Host | 264 | DiamIdent | Identidad de Diámetro de PGW-C |
| Origin-Realm | 296 | DiamIdent | Reino de Diámetro de PGW-C |
| Destination-Realm | 283 | DiamIdent | Reino del OCS |
| CC-Request-Type | 416 | Enumerated | 1 = INITIAL_REQUEST |
| CC-Request-Number | 415 | Unsigned32 | Número de secuencia (comienza en 0) |
| Subscription-Id | 443 | Grouped | Identificador de UE (IMSI/MSISDN) |
| Service-Context-Id | 461 | UTF8String | Identificador del contexto de carga |
| Multiple-Services-Credit-Control | 456 | Grouped | Solicitudes de crédito específicas del servicio |
| Requested-Service-Unit | 437 | Grouped | Cuota solicitada (bytes, tiempo, etc.) |
| Used-Service-Unit | 446 | Grouped | Cuota utilizada (0 para inicial) |
| Service-Identifier | 439 | Unsigned32 | Identificador del tipo de servicio |
| Rating-Group | 432 | Unsigned32 | Identificador de la categoría de carga |
Ejemplo de Estructura CCR-I:
CCR (Código de Comando: 272, Solicitud)
├── Session-Id: "pgw_c.example.com;123;456;gy"
├── Auth-Application-Id: 4
├── Origin-Host: "omni-pgw_c.epc.mnc999.mcc999.3gppnetwork.org"
├── Origin-Realm: "epc.mnc999.mcc999.3gppnetwork.org"
├── Destination-Realm: "epc.mnc999.mcc999.3gppnetwork.org"
├── CC-Request-Type: INITIAL_REQUEST (1)
├── CC-Request-Number: 0
├── Subscription-Id (Grouped)
│ ├── Subscription-Id-Type: END_USER_IMSI (1)
│ └── Subscription-Id-Data: "310260123456789"
├── Subscription-Id (Grouped)
│ ├── Subscription-Id-Type: END_USER_E164 (0)
│ └── Subscription-Id-Data: "15551234567"
├── Service-Context-Id: "32251@3gpp.org"
├── Multiple-Services-Credit-Control (Grouped)
│ ├── Service-Identifier: 1
│ ├── Rating-Group: 100
│ └── Requested-Service-Unit (Grouped)
│ └── CC-Total-Octets: 10000000 (solicitar 10 MB)
└── Used-Service-Unit (Grouped)
└── CC-Total-Octets: 0 (sin uso aún)
CCA-Initial (Respuesta de Control de Crédito - Inicial)
Enviado por: OCS en respuesta a CCR-I
Propósito:
- Otorgar o denegar autorización de crédito
- Proporcionar cuota para la entrega del servicio
- Especificar parámetros de tarificación y carga
AVPs Clave Recibidos por PGW-C:
| Nombre de AVP | Código de AVP | Descripción |
|---|---|---|
| Result-Code | 268 | Éxito (2001) o código de error |
| Multiple-Services-Credit-Control | 456 | Otorgamientos de crédito específicos del servicio |
| Granted-Service-Unit | 431 | Cuota otorgada (bytes, tiempo, etc.) |
| Validity-Time | 448 | Período de validez de la cuota (segundos) |
| Result-Code | 268 | Código de resultado por servicio |
| Final-Unit-Indication | 430 | Acción cuando se agota la cuota |
| Volume-Quota-Threshold | - | Umbral para re-autorización |
Ejemplo de Respuesta Exitosa:
CCA (Código de Comando: 272, Respuesta)
├── Session-Id: "pgw_c.example.com;123;456;gy"
├── Result-Code: DIAMETER_SUCCESS (2001)
├── Origin-Host: "ocs.example.com"
├── Origin-Realm: "example.com"
├── Auth-Application-Id: 4
├── CC-Request-Type: INITIAL_REQUEST (1)
├── CC-Request-Number: 0
└── Multiple-Services-Credit-Control (Grouped)
├── Result-Code: DIAMETER_SUCCESS (2001)
├── Service-Identifier: 1
├── Rating-Group: 100
├── Granted-Service-Unit (Grouped)
│ └── CC-Total-Octets: 10000000 (otorgados 10 MB)
├── Validity-Time: 3600 (cuota válida por 1 hora)
└── Volume-Quota-Threshold: 8000000 (re-autorización a 8 MB usados, 80%)
CCR-Update (Solicitud de Control de Crédito - Actualización)
Cuando:
- Se alcanza el umbral de cuota otorgada (por ejemplo, 80% consumido)
- Expira el tiempo de validez
- Un cambio de servicio requiere re-autorización
- Cambio de tiempo de tarifa
Propósito:
- Solicitar cuota adicional
- Reportar uso de la cuota otorgada previamente
- Actualizar parámetros de carga
Diferencias Clave con CCR-I:
CC-Request-Type: UPDATE_REQUEST (2)CC-Request-NumberincrementadoUsed-Service-Unitcontiene el uso realRequested-Service-Unitpara más cuota
Ejemplo de Estructura CCR-U:
CCR (Código de Comando: 272, Solicitud)
├── Session-Id: "pgw_c.example.com;123;456;gy"
├── Auth-Application-Id: 4
├── Origin-Host: "omni-pgw_c.epc.mnc999.mcc999.3gppnetwork.org"
├── Origin-Realm: "epc.mnc999.mcc999.3gppnetwork.org"
├── Destination-Realm: "epc.mnc999.mcc999.3gppnetwork.org"
├── CC-Request-Type: UPDATE_REQUEST (2)
├── CC-Request-Number: 1
└── Multiple-Services-Credit-Control (Grouped)
├── Service-Identifier: 1
├── Rating-Group: 100
├── Used-Service-Unit (Grouped)
│ └── CC-Total-Octets: 8000000 (8 MB usados hasta ahora)
└── Requested-Service-Unit (Grouped)
└── CC-Total-Octets: 10000000 (solicitar otros 10 MB)
CCA-Update (Respuesta de Control de Crédito - Actualización)
Enviado por: OCS en respuesta a CCR-U
Propósito:
- Otorgar cuota adicional (si hay crédito disponible)
- Reconocer el uso
- Actualizar parámetros de carga
Resultados Posibles:
1. Más Cuota Otorgada:
CCA (Actualización)
└── Multiple-Services-Credit-Control
├── Result-Code: DIAMETER_SUCCESS (2001)
├── Granted-Service-Unit
│ └── CC-Total-Octets: 10000000 (otros 10 MB)
└── Validity-Time: 3600
2. Cuota Final (Crédito Agotado):
CCA (Actualización)
└── Multiple-Services-Credit-Control
├── Result-Code: DIAMETER_SUCCESS (2001)
├── Granted-Service-Unit
│ └── CC-Total-Octets: 1000000 (solo 1 MB restante)
└── Final-Unit-Indication
└── Final-Unit-Action: TERMINATE (0)
3. Sin Crédito Disponible:
CCA (Actualización)
├── Result-Code: DIAMETER_CREDIT_LIMIT_REACHED (4012)
└── Multiple-Services-Credit-Control
├── Result-Code: DIAMETER_CREDIT_LIMIT_REACHED (4012)
└── Final-Unit-Indication
└── Final-Unit-Action: TERMINATE (0)
CCR-Termination (Solicitud de Control de Crédito - Terminación)
Cuando:
- UE se desconecta
- Conexión PDN eliminada
- Sesión terminada por cualquier motivo
Propósito:
- Informe final de uso
- Cerrar sesión Gy/Ro
- Liquidación final
Diferencias Clave:
CC-Request-Type: TERMINATION_REQUEST (3)Used-Service-Unitcontiene el uso final- No hay
Requested-Service-Unit(no se necesita más cuota) - Incluye
Termination-Cause
Ejemplo de Estructura CCR-T:
CCR (Código de Comando: 272, Solicitud)
├── Session-Id: "pgw_c.example.com;123;456;gy"
├── Auth-Application-Id: 4
├── Origin-Host: "omni-pgw_c.epc.mnc999.mcc999.3gppnetwork.org"
├── Origin-Realm: "epc.mnc999.mcc999.3gppnetwork.org"
├── Destination-Realm: "epc.mnc999.mcc999.3gppnetwork.org"
├── CC-Request-Type: TERMINATION_REQUEST (3)
├── CC-Request-Number: 5
├── Termination-Cause: DIAMETER_LOGOUT (1)
└── Multiple-Services-Credit-Control (Grouped)
├── Service-Identifier: 1
├── Rating-Group: 100
└── Used-Service-Unit (Grouped)
└── CC-Total-Octets: 18500000 (18.5 MB de uso total)
CCA-Termination (Respuesta de Control de Crédito - Terminación)
Enviado por: OCS en respuesta a CCR-T
Propósito:
- Reconocer la terminaci��n de la sesión
- Completar la contabilidad
- Liberar el crédito reservado
Ejemplo CCA-T:
CCA (Código de Comando: 272, Respuesta)
├── Session-Id: "pgw_c.example.com;123;456;gy"
├── Result-Code: DIAMETER_SUCCESS (2001)
├── Origin-Host: "ocs.example.com"
├── Origin-Realm: "example.com"
├── Auth-Application-Id: 4
├── CC-Request-Type: TERMINATION_REQUEST (3)
└── CC-Request-Number: 5
Flujos de Carga en Línea
Tipos de Unidades de Servicio
El OCS puede otorgar cuota en diferentes unidades:
| Tipo de Unidad | AVP | Descripción | Caso de Uso |
|---|---|---|---|
| Tiempo | CC-Time | Segundos | Llamadas de voz, duración de sesión |
| Volumen | CC-Total-Octets | Bytes (total sube+baja) | Servicios de datos |
| Volumen (separado) | CC-Input-Octets, CC-Output-Octets | Bytes (separados) | Carga asimétrica |
| Específico del Servicio | CC-Service-Specific-Units | Unidades personalizadas | SMS, MMS, llamadas API |
| Eventos | - | Eventos contados | Servicios de pago por uso |
Gestión del Umbral de Cuota
Problema: ¿Cómo sabe PGW-C cuándo solicitar más cuota?
Solución: El OCS proporciona un Volume-Quota-Threshold o Time-Quota-Threshold. PGW-C monitorea el uso a través de informes de sesión PFCP de PGW-U (ver Interfaz PFCP).
Ejemplo de Flujo:
1. OCS otorga 10 MB de cuota con umbral del 80% (8 MB)
2. PGW-C monitorea el uso a través de informes de uso de PGW-U (Informes de Sesión PFCP)
3. Cuando el uso alcanza 8 MB:
→ PGW-C envía CCR-Update
→ Continuar permitiendo tráfico (no esperar respuesta)
4. OCS responde con más cuota
5. Si la cuota se agota antes de que se envíe CCR-Update:
→ PGW-C debe bloquear el tráfico
Cálculo del Umbral:
Granted-Service-Unit: 10000000 bytes (10 MB)
Volume-Quota-Threshold: 8000000 bytes (8 MB)
Cuando se consumen 8 MB → Activar CCR-Update
Buffer restante: 2 MB (permite tiempo para la respuesta del OCS)
Monitoreo de PGW-C:
PGW-C monitorea el uso a través de Informes de Sesión PFCP de PGW-U:
Indicación de Unidad Final
¿Qué sucede cuando se agota el crédito?
El OCS incluye el AVP Final-Unit-Indication en CCA para especificar la acción:
| Acción de Unidad Final | Valor | Comportamiento de PGW-C |
|---|---|---|
| TERMINATE | 0 | Bloquear todo el tráfico, iniciar la terminación de la sesión |
| REDIRECT | 1 | Redirigir el tráfico a un portal (por ejemplo, página de recarga) |
| RESTRICT_ACCESS | 2 | Permitir acceso solo a servicios específicos (por ejemplo, servidor de recarga) |
Ejemplo: Unidad Final con Redirección
CCA (Actualización)
└── Multiple-Services-Credit-Control
├── Result-Code: DIAMETER_SUCCESS (2001)
├── Granted-Service-Unit
│ └── CC-Total-Octets: 1000000 (último 1 MB)
└── Final-Unit-Indication
├── Final-Unit-Action: REDIRECT (1)
└── Redirect-Server (Grouped)
├── Redirect-Address-Type: URL (2)
└── Redirect-Server-Address: "http://topup.example.com"
Acciones de PGW-C:
- TERMINATE: Enviar CCR-T, eliminar portadora
- REDIRECT: Instalar regla PFCP para redirigir HTTP a la URL de recarga
- RESTRICT_ACCESS: Instalar reglas PFCP que permitan solo IPs en la lista blanca
Control de Carga de Portadora
¿Qué Controla si se Carga una Portadora?
Especificación 3GPP: TS 23.203, TS 29.212, TS 32.251
La carga de portadora se controla mediante Reglas PCC proporcionadas por el PCRF a través de la interfaz Gx. Ver Interfaz Diámetro Gx para la documentación completa de reglas PCC.
Flujo de Decisión de Carga:
Regla PCC con Información de Carga
Respuesta PCRF (CCA-I en Gx):
CCA (Interfaz Gx)
└── Charging-Rule-Definition (Grouped)
├── Charging-Rule-Name: "prepaid_data_rule"
├── Rating-Group: 100
├── Online: 1 (habilitar carga en línea)
├── Offline: 0 (deshabilitar carga fuera de línea)
├── Metering-Method: VOLUME (1)
├── Precedence: 100
├── Flow-Information: [...]
└── QoS-Information: [...]
AVPs Clave de Carga en Reglas PCC:
| Nombre de AVP | Código de AVP | Valores | Descripción |
|---|---|---|---|
| Rating-Group | 432 | Unsigned32 | Categoría de carga (se mapea a tarifa en OCS) |
| Online | 1009 | 0=Deshabilitar, 1=Habilitar | Habilitar carga en línea (Gy) |
| Offline | 1008 | 0=Deshabilitar, 1=Habilitar | Habilitar carga fuera de línea (Gz) |
| Metering-Method | 1007 | 0=Duración, 1=Volumen, 2=Ambos | Qué medir |
| Reporting-Level | 1011 | 0=Servicio, 1=Grupo de Tarificación | Granularidad de informes de uso |
Matriz de Decisión de Carga de Portadora
| Online | Offline | Rating-Group | Comportamiento |
|---|---|---|---|
| 1 | 0 | Presente | Solo carga en línea (prepagada) |
| 0 | 1 | Presente | Solo carga fuera de línea (postpagada) |
| 1 | 1 | Presente | Carga en línea y fuera de línea (convergente) |
| 0 | 0 | - | Sin carga (servicio gratuito) |
Múltiples Grupos de Tarificación
Una sola conexión PDN puede tener múltiples portadoras con diferentes grupos de tarificación:
Ejemplo de Escenario:
Portadora Predeterminada (Internet)
├── Rating-Group: 100 (Datos Estándar)
└── Online: 1
Portadora Dedicada 1 (Streaming de Video)
├── Rating-Group: 200 (Servicio de Video)
└── Online: 1
Portadora Dedicada 2 (Voz IMS)
├── Rating-Group: 300 (Voz)
└── Online: 1
Comportamiento de PGW-C Gy:
- Un solo CCR-I con múltiples secciones MSCC (Control de Crédito para Múltiples Servicios):
CCR-Initial
├── Session-Id: "..."
└── Multiple-Services-Credit-Control
├── [Rating-Group: 100] → Datos Estándar
├── [Rating-Group: 200] → Servicio de Video
└── [Rating-Group: 300] → Voz
Respuesta del OCS:
CCA-Initial
└── Multiple-Services-Credit-Control
├── [Rating-Group: 100] → Otorgado: 10 MB
├── [Rating-Group: 200] → Otorgado: 5 MB (video más caro)
└── [Rating-Group: 300] → Otorgado: 60 segundos
Aplicación de Carga por Servicio
PGW-C rastrea la cuota por Grupo de Tarificación:
# Pseudocódigo
state.charging_quotas = %{
100 => %{granted: 10_000_000, used: 0, threshold: 8_000_000},
200 => %{granted: 5_000_000, used: 0, threshold: 4_000_000},
300 => %{granted: 60_000, used: 0, threshold: 48_000} # milisegundos
}
Monitoreo de Uso por Portadora:
Control de Crédito para Múltiples Servicios
AVP MSCC (Control de Crédito para Múltiples Servicios)
Propósito: Agrupar información de carga para un servicio/grupo de tarificación específico
Estructura:
Multiple-Services-Credit-Control (Grouped, AVP 456)
├── Service-Identifier (Unsigned32, AVP 439)
├── Rating-Group (Unsigned32, AVP 432)
├── Requested-Service-Unit (Grouped, AVP 437)
│ ├── CC-Time (Unsigned32, AVP 420)
│ ├── CC-Total-Octets (Unsigned64, AVP 421)
│ ├── CC-Input-Octets (Unsigned64, AVP 412)
│ └── CC-Output-Octets (Unsigned64, AVP 414)
├── Used-Service-Unit (Grouped, AVP 446)
│ └── [Misma estructura que Requested-Service-Unit]
├── Granted-Service-Unit (Grouped, AVP 431)
│ └── [Misma estructura que Requested-Service-Unit]
├── Validity-Time (Unsigned32, AVP 448)
├── Result-Code (Unsigned32, AVP 268)
└── Final-Unit-Indication (Grouped, AVP 430)
└── Final-Unit-Action (Enumerated, AVP 449)
Service-Identifier vs. Rating-Group
| Atributo | Service-Identifier | Rating-Group |
|---|---|---|
| Propósito | Identifica el tipo de servicio | Identifica la categoría de carga |
| Ejemplo | 1=Datos, 2=Voz, 3=SMS | 100=Regular, 200=Premium |
| Granularidad | Clasificación amplia | Tarifa específica |
| Requerido | Opcional | Requerido para la carga |
| Mapeo | Puede mapear a múltiples RGs | Tarifa única en OCS |
Ejemplo:
Service-Identifier: 1 (Servicio de Datos)
├── Rating-Group: 100 (Datos Estándar - $0.01/MB)
└── Rating-Group: 200 (Datos Premium - $0.05/MB)
Service-Identifier: 2 (Voz)
└── Rating-Group: 300 (Llamadas de Voz - $0.10/min)
Configuración
Configuración Básica de Gy
Edita config/runtime.exs:
config :pgw_c,
gy: %{
# Habilitar o deshabilitar la carga en línea globalmente
enabled: true,
# Tiempo de espera de conexión OCS (milisegundos)
timeout_ms: 5000,
# Cuota de solicitud predeterminada (bytes) si no se especifica por PCRF
default_requested_quota: 10_000_000, # 10 MB
# Porcentaje de umbral para re-autorización
# (0.8 = activar CCR-Update al 80% de cuota consumida)
quota_threshold_percentage: 0.8,
# Acción cuando ocurre un tiempo de espera de OCS
# Opciones: :block, :allow
timeout_action: :block,
# Acción cuando OCS no devuelve crédito
# Opciones: :terminate, :redirect
no_credit_action: :terminate,
# URL de redirección para recarga (usada si no_credit_action: :redirect)
topup_redirect_url: "http://topup.example.com"
},
diameter: %{
listen_ip: "0.0.0.0",
host: "omni-pgw_c.epc.mnc999.mcc999.3gppnetwork.org",
realm: "epc.mnc999.mcc999.3gppnetwork.org",
# Configuración del par OCS
peer_list: [
# PCRF para control de políticas (Gx)
%{
host: "pcrf.epc.mnc999.mcc999.3gppnetwork.org",
realm: "epc.mnc999.mcc999.3gppnetwork.org",
ip: "10.0.0.30",
initiate_connection: true
},
# OCS para carga en línea (Gy)
%{
host: "ocs.epc.mnc999.mcc999.3gppnetwork.org",
realm: "epc.mnc999.mcc999.3gppnetwork.org",
ip: "10.0.0.40",
initiate_connection: true
}
]
}
Parámetros de Configuración Explicados
enabled
true: Carga en línea activa, mensajes CCR enviados al OCSfalse: Carga en línea deshabilitada, sin mensajes Gy
timeout_ms
- Tiempo a esperar por respuesta CCA del OCS
- Recomendado: 3000-5000 ms
default_requested_quota
- Cuota predeterminada a solicitar si el PCRF no especifica
- Valores típicos: 1-100 MB
quota_threshold_percentage
- Activar CCR-Update cuando se consuma este % de cuota
- Recomendado: 0.75-0.85 (75%-85%)
- Más alto = menos mensajes, pero riesgo de agotamiento de cuota
- Más bajo = más mensajes, pero más seguro
timeout_action
:block- Bloquear tráfico si OCS no responde (más seguro, previene pérdida de ingresos):allow- Permitir tráfico si OCS no responde (mejor UX, riesgo de ingresos)
no_credit_action
:terminate- Eliminar portadora cuando se agota el crédito:redirect- Redirigir a portal de recarga
Configuración Específica del Entorno
Producción (suscriptores prepagados):
config :pgw_c,
gy: %{
enabled: true,
timeout_action: :block,
no_credit_action: :terminate,
quota_threshold_percentage: 0.8
}
Prueba/Desarrollo:
config :pgw_c,
gy: %{
enabled: false # Deshabilitar para pruebas
}
Híbrido (algunos prepagados, algunos postpagados):
config :pgw_c,
gy: %{
enabled: true, # Controlado por suscriptor por PCRF
timeout_action: :allow, # No bloquear postpago en fallo de OCS
no_credit_action: :terminate
}
Flujos de Mensajes
Sesión Exitosa con Carga en Línea
Re-autorización de Cuota (CCR-Update)
Agotamiento de Crédito (Unidad Final)
Manejo de Tiempo de Espera de OCS
Manejo de Errores
Códigos de Resultado
Códigos de Éxito:
| Código | Nombre | Acción |
|---|---|---|
| 2001 | DIAMETER_SUCCESS | Continuar con la cuota otorgada |
Fallos Transitorios (4xxx):
| Código | Nombre | Acción de PGW-C |
|---|---|---|
| 4010 | DIAMETER_TOO_BUSY | Reintentar con retroceso |
| 4011 | DIAMETER_UNABLE_TO_COMPLY | Registrar error, puede reintentar |
| 4012 | DIAMETER_CREDIT_LIMIT_REACHED | Terminar o redirigir |
Fallos Permanentes (5xxx):
| Código | Nombre | Acción de PGW-C |
|---|---|---|
| 5003 | DIAMETER_AUTHORIZATION_REJECTED | Rechazar sesión |
| 5031 | DIAMETER_USER_UNKNOWN | Rechazar sesión (suscriptor inválido) |
Códigos de Resultado por Servicio
Importante: El código de resultado puede aparecer en dos niveles:
- Nivel de mensaje - Resultado general
- Nivel de MSCC - Resultado por servicio
Ejemplo:
CCA-Initial
├── Result-Code: DIAMETER_SUCCESS (2001) ← Nivel de mensaje: OK
└── Multiple-Services-Credit-Control
├── [Rating-Group: 100]
│ └── Result-Code: DIAMETER_SUCCESS (2001) ← RG 100: OK
└── [Rating-Group: 200]
└── Result-Code: DIAMETER_CREDIT_LIMIT_REACHED (4012) ← RG 200: Sin crédito
Comportamiento de PGW-C:
- Permitir tráfico para Rating-Group 100
- Bloquear tráfico para Rating-Group 200
Integración con Gx
La interfaz Gx (control de políticas PCRF) determina si se requiere carga en línea y proporciona el Rating-Group que impulsa la carga Gy. Ver Interfaz Diámetro Gx para la documentación completa de control de políticas.
Relación entre Gx y Gy
Flujo de Integración
1. Configuración de Portadora:
PGW-C recibe Solicitud de Crear Sesión
↓
Enviar CCR-I a PCRF (Gx)
↓
Recibir CCA-I con Reglas PCC
↓
Analizar Reglas PCC:
- ¿La regla tiene Rating-Group?
- ¿Es Online = 1?
↓
Si SÍ:
Enviar CCR-I a OCS (Gy) con Rating-Group
↓
Recibir CCA-I con cuota
↓
Si cuota otorgada: Proceder
Si sin crédito: Rechazar portadora
Si NO:
Proceder sin carga en línea
2. Actualización de Política Din��mica (RAR de PCRF):
PCRF envía RAR (Re-Auth-Request) en Gx
↓
Nueva Regla PCC añadida con Online=1, Rating-Group=200
↓
PGW-C envía CCR-U a OCS (Gy)
- Añadir MSCC para Rating-Group 200
↓
OCS otorga cuota para el nuevo servicio
↓
Instalar portadora dedicada con carga en línea
Solución de Problemas
Problemas Comunes
1. Tiempos de Espera de CCR-Initial a OCS
Síntomas:
- Las sesiones fallan con "tiempo de espera de OCS"
- Registro: "Tiempo de espera de CCR-Initial (Gy)"
Causas Posibles:
- OCS no accesible
- IP de OCS incorrecta en la configuración
- Cortafuegos bloqueando el puerto de Diámetro (3868)
- OCS sobrecargado
Resolución:
# Probar conectividad de red
ping <ocs_ip>
# Probar puerto de Diámetro (TCP 3868)
telnet <ocs_ip> 3868
# Verificar configuración
# Asegurarse de que el par OCS esté configurado en peer_list
2. Sesiones Rechazadas por OCS
Síntomas:
- CCA-I con Result-Code != 2001
- Fallo en la Respuesta de Crear Sesión
Códigos de Resultado Comunes:
| Código de Resultado | Causa Probable | Resolución |
|---|---|---|
| 4012 | Límite de crédito alcanzado | El suscriptor necesita recargar |
| 5003 | Autorización rechazada | Verificar permisos del suscriptor |
| 5031 | Usuario desconocido | Provisionar suscriptor en OCS |
Pasos de Depuración:
- Verificar registros de OCS para la razón del rechazo
- Verificar saldo del suscriptor en OCS
- Comprobar que IMSI/MSISDN en CCR-I coincida con el registro del suscriptor
3. Agotamiento de Cuota No Detectado
Síntomas:
- El usuario continúa usando datos después de que se agota el saldo
- No se envió CCR-Update
Causas Posibles:
- URR (Regla de Informe de Uso) no instalada en PGW-U
- Umbral no configurado correctamente
- No se recibieron Informes de Sesión PFCP
Pasos de Depuración:
-
Verificar URR en Establecimiento de Sesión PFCP:
Crear URR
├── URR-ID: 1
├── Measurement-Method: VOLUME
├── Volume-Threshold: 8000000 (8 MB)
└── Reporting-Triggers: VOLUME_THRESHOLD -
Comprobar registros de PGW-U para informes de uso
-
Verificar
quota_threshold_percentageen la configuración
4. Grupo de Tarificación Incorrecto
Síntomas:
- OCS rechaza con "Grupo de Tarificación Desconocido"
- Las sesiones fallan
Causa:
- Grupo de Tarificación en CCR-I no coincide con la configuración de OCS
- PCRF provisionó un Grupo de Tarificación inválido
Resolución:
- Verificar Grupo de Tarificación en la Regla PCC del PCRF
- Comprobar configuración de OCS para Grupos de Tarificación válidos
- Asegurarse de que el mapeo entre Reglas PCC y tarifas de OCS sea correcto
Monitoreo
Métricas Clave
# Tasas de mensajes Gy
rate(gy_inbound_messages_total{message_type="cca"}[5m])
rate(gy_outbound_messages_total{message_type="ccr"}[5m])
# Tasas de errores Gy
rate(gy_inbound_errors_total[5m])
# Eventos de agotamiento de cuota
rate(gy_quota_exhausted_total[5m])
# Tasa de tiempo de espera de OCS
rate(gy_timeout_total[5m])
# Duración del manejo de mensajes Gy
histogram_quantile(0.95, rate(gy_inbound_handling_duration_bucket[5m]))
Alertas
# Alerta sobre alta tasa de errores Gy
- alert: GyErrorRateHigh
expr: rate(gy_inbound_errors_total[5m]) > 0.1
for: 5m
annotations:
summary: "Se detectó una alta tasa de errores Gy"
# Alerta sobre tiempo de espera de OCS
- alert: OcsTimeout
expr: rate(gy_timeout_total[5m]) > 0.05
for: 2m
annotations:
summary: "Se están produciendo tiempos de espera de OCS"
# Alerta sobre pico de agotamiento de crédito
- alert: CreditExhaustionSpike
expr: rate(gy_quota_exhausted_total[5m]) > 10
for: 5m
annotations:
summary: "Alta tasa de agotamiento de crédito"
Control de Crédito Gy (API OAM)
La carga en línea se inspecciona y ejerce a través de la API REST OAM, servida sobre
HTTPS/TLS en https://<host>:8443. La documentación interactiva de la API (Swagger UI) está disponible
en https://<host>:8443/api/docs.
Estado de Carga en Línea
GET /api/charging # todas las sesiones de carga en línea + estado de crédito en vivo
GET /api/charging?search=<imsi> # filtrar sesiones por IMSI
GET /api/charging/<imsi> # estado de control de crédito de una sesión por IMSI
Ejemplo:
curl -k https://localhost:8443/api/charging/310170123456789
GET /api/charging devuelve el estado de carga en línea (cuota otorgada vs. usada, validez, la
acción Final-Unit del OCS, y estado de redirección / sin crédito) para cada sesión activa. Agrega ?search=<imsi> para reducir la lista, o agrega el IMSI a
GET /api/charging/<imsi> para obtener el estado de control de crédito de un solo suscriptor.
Simulador de Control de Crédito Gy
POST /api/gy_simulator
Envía una Solicitud de Control de Crédito sintética al OCS configurado y devuelve la respuesta
analizada: código de resultado a nivel de comando, cuota otorgada, tiempo de validez, y cualquier
Indicación de Unidad Final, para que la carga en línea se pueda ejercer sin tráfico de suscriptor en vivo. Esta es la API OAM que reemplaza al antiguo simulador Gy basado en navegador. Requiere que Gy esté habilitado (gy.enabled: true); la solicitud se envía desde el propio host de origen Gy de PGW-C al reino OCS configurado.
Cuerpo de la solicitud (application/json):
| Campo | Tipo | Descripción |
|---|---|---|
imsi | string | Requerido. IMSI del suscriptor. |
msisdn | string | MSISDN opcional (E.164). Población User-Name como <msisdn>@<apn>. |
apn | string | APN opcional. |
requested_units | integer | Cuota solicitada opcional en octetos (Requested-Service-Unit → CC-Total-Octets). |
rating_group | integer | Grupo de Tarificación / clave de carga opcional (predeterminado 1). |
service_id | integer | Identificador de Servicio opcional. |
cc_request_type | string | initial (predeterminado), update, o terminate (o el numérico 1/2/3). |
Ejemplo: solicitar 1 MB de cuota inicial para un suscriptor:
curl -k -X POST https://localhost:8443/api/gy_simulator \
-H 'content-type: application/json' \
-d '{"imsi":"310170123456789","msisdn":"14155551234","apn":"internet","requested_units":1000000,"rating_group":1}'
Ejemplo de respuesta (CCA-Initial otorgando 1 MB, válido por 1 hora):
{
"session_id": "omni-pgw_c.epc...;734825199;app_gy_sim",
"cc_request_type": 1,
"cc_request_type_name": "initial",
"result_code": "diameter_success",
"accepted": true,
"ocs_host": "ocs.epc.example.org",
"ocs_realm": "epc.example.org",
"granted": { "total_octets": 1000000, "input_octets": null, "output_octets": null, "time": null },
"validity_time": 3600,
"final_unit_action": null,
"final_unit_redirect": null,
"mscc_result_code": "diameter_success"
}
En caso de fallo, el punto final devuelve 422 (imsi faltante) o 503 (Gy deshabilitado, o el OCS
no respondió — el campo reason lleva el error subyacente, por ejemplo, :timeout).
Casos de Uso Operativos
- Inspeccionar la cuota de un suscriptor —
GET /api/charging/<imsi>devuelve la cuota actual y estado de crédito de la sesión. - Probar la integración de OCS sin tráfico —
POST /api/gy_simulatorpara confirmar que el OCS otorga la cuota esperada / Acción Final-Unit para un IMSI, grupo de tarificación o servicio dado. - Solucionar problemas de carga — localizar un suscriptor afectado con
GET /api/charging?search=<imsi>y revisar su estado de control de crédito en vivo.
Para tendencias históricas (tasas de mensajes, agotamiento de cuota, tiempos de espera de OCS) utiliza las métricas de Prometheus descritas en Monitoreo arriba.
Documentación Relacionada
Carga y Política
- Interfaz Diámetro Gx - Control de políticas PCRF, reglas PCC que activan la carga en línea
- Formato de CDR de Datos - Registros de carga fuera de línea para facturación postpaga
- Guía de Configuración - Parámetros completos de configuración de carga en línea
Gestión de Sesiones
- Gestión de Sesiones - Ciclo de vida de la sesión PDN, gestión de portadoras
- Interfaz PFCP - Informe de uso de PGW-U a través de URRs
- Interfaz S5/S8 - Configuración y eliminación de portadoras GTP-C
Operaciones
- Guía de Monitoreo - Métricas Gy, seguimiento de cuotas, alertas de tiempo de espera de OCS
- Asignación de IP de UE - Configuración de grupos de IP para sesiones con carga