Opened 3 years ago

Closed 2 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).

Change History (2)

in reply to:  description comment:1 by alx, 2 years ago

Replying to san:

  • Во-первых, думаю надо сделать проверку кода завершения функции уничтожения канала чтобы, как минимум, канальное окончание знало, что канал не уничтожился, и не пыталось его потом создавать.

Как выяснилось, такая проверка уже имеется на самом низком уровне - если SUPVSR_DESTROY_CHANNEL завершается с ошибкой, channelId не меняется, и канал по-прежнему считается созданным.

comment:2 by alx, 2 years ago

Resolution: fixed
Status: newclosed

In 1995/sip_ua:

Если при попытке создать соединение MSP возвращает ошибку 0xfffd (ERR_TDMDRV_INVTS),
что бывает в случае, когда соединение с таким номером таймслота уже существует,
выполняется попытка найти и уничтожить это соединение, после чего повторить
неудавшуюся ранее попытку создания. Проверено на синтетическом тесте. Closes #355.
Также убраны ненужные VOPENA перед уничтожением соединения.

Note: See TracTickets for help on using tickets.