Разработать упрощённую модель PGW, способную:
- Обрабатывать UDP-запросы с IMSI абонентов
- Управлять сессиями (создание/удаление)
- Вести CDR-журнал (Call Detail Record)
- Предоставлять HTTP API для мониторинга
- Поддерживать чёрный список IMSI
- Обеспечивать graceful shutdown
| Компонент | Функционал |
|---|---|
| UDP-сервер | Приём пакетов с IMSI, отправка ответов ('created'/'rejected') |
| Менеджер сессий | Управление жизненным циклом сессий (таймаут) |
| CDR-журнал | Запись действий в формате: timestamp, IMSI, action |
| HTTP API | 2 эндпоинта: /check_subscriber и /stop |
| Чёрный список | Автоматический отказ для IMSI из списка |
| Логирование | Запись ключевых событий в файл лог |
| Конфигурация | Чтение параметров из JSON (порты, таймауты, пути к файлам) |
| Функционал | Описание |
|---|---|
| CLI-интерфейс | Запуск с передачей IMSI (./pgw_client 001010123456789) |
| UDP-коммуникация | Отправка запроса и получение ответа от сервера |
| Логирование | Запись событий в файл лог |
- Запрос: IMSI в BCD-кодировке (TS 29.274 §8.3)
- Ответ: ASCII-строка
createdилиrejected
CDR (Call Detail Record) – это структура, содержащая сведения о действиях с идентификатором IMSI. Ниже перечислены возможные действия (Action) и их описание.
| Действие | Строковое значение | Описание |
|---|---|---|
Create |
"create" |
Создание новой записи для указанного IMSI |
Reject |
"reject" |
Отклонение подключения, например, при недопустимом IMSI или других ошибках |
Delete |
"delete" |
Удаление записи по таймеру (автоматическое завершение сессии по истечении времени) |
Offload |
"offload" |
Завершение и выгрузка записи при остановке сервера |
Update |
"update" |
Повторное подключение с тем же IMSI, ведущее к обновлению текущей сессии |
Каждая запись CDR содержит следующие поля:
IMSI– идентификатор абонентаAction– действие, одно из описанных вышеTimestamp– время действия
2025-07-27 13:32:06,001010123456786,create
2025-07-27 13:32:20,001010123456786,offload
Приложение использует отдельные потоки для разных задач:
- Поток для обработки UDP-запросов
- Поток для обработки HTTP-запросов
- Поток для периодической очистки неактивных сессий
Реализована корректная остановка приложения:
- Использование Crow framework для обработки HTTP-запросов и graceful shutdown
- Поддержка асинхронного завершения работы сервера через
stop()метод - Завершение активных соединений
- Освобождение ресурсов
- Корректное завершение работы всех потоков
- Постепенное (rate-limited) отключение активных сессий при получении сигнала /stop
Используется библиотека spdlog для многоуровневого логирования:
- DEBUG – отладочная информация
- INFO – основная информация о работе приложения
- WARN – предупреждения о нештатных ситуациях
- ERROR – критические ошибки
- Приложение перехватывает и обрабатывает сигналы:
- SIGINT (Ctrl+C)
- SIGTERM (сигнал завершения)
- При получении сигналов выполняется clean stop приложения
- Для HTTP-интерфейса реализован специальный endpoint /stop для инициации graceful shutdown
Сборка проекта выполняется с использованием CMake под Linux:
mkdir build && cd build
cmake ..
makeТестирование реализовано с помощью юнит-тестов на базе фреймворка Google Test
SessionManager– управление сессиями и их состояниямиConfigLoader– загрузка конфигурации из файлаUdpClient– кодировка сообщенийUdpServer– корректность декодирования сообщений
Исполняемый файл с тестами: build/bin/unit_tests
./pgw_server./pgw_client 001010123456785curl "http://localhost:8080/check_subscriber?imsi=001010123456785"curl "http://localhost:8080/stop"