Opened 7 years ago

Closed 6 years ago

#205 closed баг (fixed)

Гонки при вызове окончанием FXS в момент опускания трубки

Reported by: alx Owned by: alx
Priority: средний Milestone: 1 очередь
Component: any Keywords:
Cc:

Description

  1. Абонент 108 снял трубку.
  2. Абонент набрал 9.
  3. Перед самым истечением таймаута набора абонент положил трубку.
  4. Таймаут набора истек и произошел вызов, при этом занялось принявшее вызов окончание FXO.
  5. Истек таймер отбоя (500 мс), но при попытке снятия вызова произошла ошибка.

Как резальтат - окончание FXO осталось "висеть" вечно. Session timer успешно рефрешился.

Nov 15 08:12:28 sip_ua[623]: fxs.cpp:407: ---> ts=7, state=Idle: CAS A activity detected, ts=7, flags=0000, data=0
Nov 15 08:12:28 sip_ua[623]: fxs.cpp:407: ---> ts=7, state=Idle: CAS event, ts=7, flags=0000, data=7
Nov 15 08:12:28 sip_ua[623]: fxs.cpp:677: ==> ts 7: manual CAS event processing (abcd=15)
Nov 15 08:12:28 sip_ua[623]: fxs.cpp:407: ---> ts=7, state=Dialtone: CAS event, ts=7, flags=0000, data=7
Nov 15 08:12:30 sip_ua[623]: fxs.cpp:407: ---> ts=7, state=Dialtone: DTMF detected, ts=7, flags=0000, data=9
Nov 15 08:12:30 sip_ua[623]: fxs.cpp:407: ---> ts=7, state=Dialing: Tone completed, ts=7, flags=0000, data=3
Nov 15 08:12:30 sip_ua[623]: fxs.cpp:407: ---> ts=7, state=Dialing: Tone detected, ts=7, flags=0000, data=255
Nov 15 08:12:34 sip_ua[623]: fxs.cpp:407: ---> ts=7, state=Dialing: CAS event, ts=7, flags=0000, data=15
Nov 15 08:12:35 sip_ua[623]: fxs.cpp:233: ts 7: dialing 9
Nov 15 08:12:35 sip_ua[623]: user_agent.cpp:2478: --> ua_dial_out() "ëÕÌØÍÅÔØÅ× á. á." <sip:108@192.168.0.4> -> sip:9@192.168.0.4 ()...
Nov 15 08:12:35 sip_ua[623]: user_agent.cpp:2913: eXosip_call_terminate(624, 0) error -3
Nov 15 08:12:35 sip_ua[623]: comcerto.cpp:3808: ts 7: ua_hangup() error -3
Nov 15 08:12:35 sip_ua[623]: fxs.cpp:407: ---> ts=7, state=Idle: Call disconnected, ts=7, flags=0000, data=624
Nov 15 08:12:35 sip_ua[645]: user_agent.cpp:1488: INVITE received: sip:9@127.0.0.1:6060;transport=udp (Call-ID: 1819733365@(null))
Nov 15 08:12:35 sip_ua[623]: fxs.cpp:407: ---> ts=1, state=Idle: Incoming call, ts=-1, flags=0001, data=625
Nov 15 08:12:35 sip_ua[623]: fxs.cpp:407: ---> ts=2, state=Idle: Incoming call, ts=-1, flags=0001, data=625
Nov 15 08:12:35 sip_ua[623]: fxs.cpp:407: ---> ts=3, state=Idle: Incoming call, ts=-1, flags=0001, data=625
Nov 15 08:12:35 sip_ua[623]: fxs.cpp:407: ---> ts=4, state=Idle: Incoming call, ts=-1, flags=0001, data=625
Nov 15 08:12:35 sip_ua[623]: fxs.cpp:407: ---> ts=5, state=Idle: Incoming call, ts=-1, flags=0001, data=625
Nov 15 08:12:35 sip_ua[623]: fxs.cpp:407: ---> ts=6, state=Idle: Incoming call, ts=-1, flags=0001, data=625
Nov 15 08:12:35 sip_ua[623]: fxs.cpp:407: ---> ts=7, state=Idle: Incoming call, ts=-1, flags=0001, data=625
Nov 15 08:12:35 sip_ua[623]: fxs.cpp:407: ---> ts=8, state=Idle: Incoming call, ts=-1, flags=0001, data=625
Nov 15 08:12:35 sip_ua[623]: fxs.cpp:407: ---> ts=9, state=Idle: Incoming call, ts=-1, flags=0001, data=625
Nov 15 08:12:35 sip_ua[623]: fxs.cpp:407: ---> ts=10, state=Idle: Incoming call, ts=-1, flags=0001, data=625
Nov 15 08:12:35 sip_ua[623]: fxs.cpp:407: ---> ts=11, state=Idle: Incoming call, ts=-1, flags=0001, data=625
Nov 15 08:12:35 sip_ua[623]: fxs.cpp:407: ---> ts=14, state=Idle: Incoming call, ts=-1, flags=0001, data=625
Nov 15 08:12:35 sip_ua[623]: fxs.cpp:407: ---> ts=15, state=Idle: Incoming call, ts=-1, flags=0001, data=625
Nov 15 08:12:35 sip_ua[623]: fxs.cpp:407: ---> ts=17, state=Idle: Incoming call, ts=-1, flags=0001, data=625
Nov 15 08:12:35 sip_ua[623]: fxs.cpp:407: ---> ts=29, state=Idle: Incoming call, ts=-1, flags=0001, data=625
Nov 15 08:12:35 sip_ua[623]: fxo.cpp:338: ---> ts=33, state=Idle: Incoming call, ts=-1, flags=0001, data=625
Nov 15 08:12:35 sip_ua[623]: fxs.cpp:407: ---> ts=10, state=Idle: Incoming call, ts=-1, flags=0002, data=625
Nov 15 08:12:35 sip_ua[623]: user_agent.cpp:2829: Call 625 routed to TS 33
Nov 15 08:12:35 sip_ua[623]: comcerto.cpp:3779: channel 33: answer
Nov 15 08:12:35 sip_ua[623]: fxo.cpp:338: ---> ts=33, state=Connected: RTP parameters, ts=33, flags=0000, data=625
Nov 15 08:12:35 sip_ua[623]: comcerto.cpp:4564: --> ts 33: 192.168.0.4[10066] --> 192.168.0.4[10014]
Nov 15 08:12:35 sip_ua[623]: comcerto.cpp:4565: --> ts 33: codec PCMA, VAD is off
Nov 15 08:12:35 sip_ua[623]: comcerto.cpp:4566: --> audio pt: 8/8, event pt: 101/101, VBD pt: 98/98
Nov 15 08:12:35 sip_ua[623]: comcerto.cpp:4666: ts 33: starting RTP stream to 02:ad:c3:00:00:b4
Nov 15 08:12:35 sip_ua[623]: fxs.cpp:407: ---> ts=7, state=Idle: RTP parameters, ts=7, flags=0000, data=624

Change History (3)

comment:1 by alx, 7 years ago

Ошибка -3 означает OSIP_WRONG_STATE. Суть ее, похоже, в том, что пока на отправленное сообщение не получен какой-либо ответ (хотя бы 100), отменить вызов невозможно (см. #16).

В качестве решения предлагается следующее:

  • При получении ошибки OSIP_WRONG_STATE на eXosip_call_terminate() устанавливать какой-то флаг (needTerminate) в дескрипторе соединения, при получении любого ответа проверять этот флаг, и если флаг установлен, повторно вызывать eXosip_call_terminate().
  • Если приходит событие, связанное с соединением, которого канальное окончание не знает, выполнять отбой этого соединения (это опасно, т.к. событие может быть связано с соединением, находящимся в процессе трансфера).

comment:2 by alx, 6 years ago

Сделан синтетический тест: сразу после ua_dial_out() окончание FXS вызывает ua_hangup().
Проблема воспроизводится: у вызывающего - короткие гудки, а у вызываемого звенит звонок.

Применение флага как предложено выше проблему устранило.

comment:3 by alx, 6 years ago

Resolution: fixed
Status: newclosed

In 1391/sip_ua:

При получении ответа OSIP_WRONG_STATE на вызов eXosip_call_terminate()
ua_hangup() устанавливает дескриптору вызова флаг terminated.
Позже при получении любого ответа в данном диалоге проверяется флаг
terminated, и если он установлен, повторно выполняется eXosip_call_terminate().
Closes #205.

Note: See TracTickets for help on using tickets.