Opened 4 years ago
Closed 3 years ago
#355 closed баг (fixed)
Ошибка TDM timeslot is invalid при создании канала
Reported by: | san | Owned by: | alx |
---|---|---|---|
Priority: | средний | Milestone: | 1 очередь |
Component: | VE-01 | Keywords: | |
Cc: |
Description
Предыстория:
Алексей Д. и Влад, экспериментируя с аппаратурой PLC-АДАСЭ, подключенной к порту FXS нашей АТС, обнаружили, что соответствующее окончание FXS вдруг сломалось: на вызов из IP оно отвечает Temporary Unavailable и не отображает изменения состояний при изменении СУВ со стороны tdm(при поднятии трубки остаётся в состоянии Idle).
Далее коментарии от alx:
!!!!! function SUPVSR_CREATE_CHANNEL (0x0010): error ERR_TDMDRV_INVTS (0xffbd): TDM timeslot is invalid
(MSP считает, что сам номер таймслота 15 является неправильным - типа не бывает такого таймслота как 15).На самом деле плата СУВ видит, но при попытке создать соответствующий канал MSP возвращает ошибку. Почему MSP считает таймслот invalid, я не знаю. Предполагаю, что имеет место баг в MSP.
При перезапуске sip_ua сказал: dead channel 15 found (channelId=0x0005)
. Заработало. А диагностика из MSP оказалась не очень адекватной...
Для начала имеет смысл проанализировать код и попытаться понять, почему рассинхронизировались состояние MSP (канал был создан) и канального окончания (которое считало, что канал не создан).
Разглядывая код, я могу предположить следующие причины:
- при запросе создать канал MSP создал канал, но почему-то вернул ошибку;
- при запросе уничтожить канал MSP почему-то канал не уничтожил (возможно, вернул какую-то ошибку, однако в коде успешность уничтожения канала не проверяется).
Что делать:
- Во-первых, думаю надо сделать проверку кода завершения функции уничтожения канала чтобы, как минимум, канальное окончание знало, что канал не уничтожился, и не пыталось его потом создавать.
- Во-вторых, можно обрабатывать ошибку создания канала ERR_TDMDRV_INVTS и делать попытку запроса его ID по номеру таймслота (как это делается при старте sip_ua).
Replying to san:
Как выяснилось, такая проверка уже имеется на самом низком уровне - если SUPVSR_DESTROY_CHANNEL завершается с ошибкой, channelId не меняется, и канал по-прежнему считается созданным.