Opened 8 years ago

Closed 7 years ago

Last modified 7 years ago

#184 closed баг (fixed)

Программа не регистрируется на SIP-сервере по IPv6

Reported by: alx Owned by: dimag
Priority: trivial Milestone: 2 очередь
Component: ПО MC04-Dispatcher. Пульт диспетчера/техника Keywords: IPv6, network
Cc: san

Description

При входе в систему по IPv6 возникает ошибка при попытке регистрации на SIP-сервере:

Failed to resolve 'voip6.kolez.com'.

Более подробный лог такой:

17:28:22.685       pa_dev.c  ..PortAudio sound library initialized, status=0
17:28:22.685       pa_dev.c  ..PortAudio host api count=2
17:28:22.685       pa_dev.c  ..Sound device count=0
17:28:22.685          pjlib  ..select() I/O Queue created (0xed59c8)
17:28:22.693 sip_endpoint.c  .Module "mod-evsub" registered
17:28:22.693 sip_endpoint.c  .Module "mod-presence" registered
17:28:22.693 sip_endpoint.c  .Module "mod-mwi" registered
17:28:22.693 sip_endpoint.c  .Module "mod-refer" registered
17:28:22.693 sip_endpoint.c  .Module "mod-pjsua-pres" registered
17:28:22.693 sip_endpoint.c  .Module "mod-pjsua-im" registered
17:28:22.693 sip_endpoint.c  .Module "mod-pjsua-options" registered
17:28:22.693   pjsua_core.c  .1 SIP worker threads created
17:28:22.693   pjsua_core.c  .pjsua version 2.1 for Linux-4.4.0.22/x86_64/glibc-2.17 initialized
17:28:22.693   pjsua_core.c  .PJSUA state changed: CREATED --> INIT
17:28:22.693   pjsua_core.c  bind() error: Адрес уже используется [status=120098]
17:28:22.694   pjsua_core.c  SIP UDP socket reachable at 192.168.0.63:5061
17:28:22.694    udp0xef1470  SIP UDP transport started, published address is 192.168.0.63:5061
17:28:22.694   pjsua_core.c  PJSUA state changed: INIT --> STARTING
17:28:22.694 sip_endpoint.c  .Module "mod-unsolicited-mwi" registered
17:28:22.694   pjsua_core.c  .PJSUA state changed: STARTING --> RUNNING
17:28:22.694    pjsua_acc.c  Adding account: id=sip:2@voip6.kolez.com
17:28:22.694    pjsua_acc.c  .Account sip:2@voip6.kolez.com added with id 0
17:28:22.694    pjsua_acc.c  .Acc 0: setting registration..
17:28:22.701  sip_resolve.c  ...Failed to resolve 'voip6.kolez.com'. Err=70018 (gethostbyname() has returned error (PJ_ERESOLVE))
17:28:22.701    tsx0xef8598  ...Failed to send Request msg REGISTER/cseq=63038 (tdta0xef6530)! err=70018 (gethostbyname() has returned error (PJ_ERESOLVE))
17:28:22.701    pjsua_acc.c  .....SIP registration failed, status=502 (gethostbyname() has returned error (PJ_ERESOLVE))
17:28:22.701    pjsua_acc.c  .....Scheduling re-registration retry for acc 0 in 1 seconds..
17:28:22.701      sip_reg.c  ..Error sending request, status=70018
17:28:22.701    pjsua_acc.c  ..Unable to create/send REGISTER: gethostbyname() has returned error (PJ_ERESOLVE) [status=70018]
Startup dlg  finished
ESL Connected
 Window Icon setted
MainAppFrameWindow2 ctor
pLogViewWidget created
pSplitterSoundPlay created
Main Window created
17:28:24.044    pjsua_acc.c  Acc 0: setting registration..
17:28:24.051  sip_resolve.c  ..Failed to resolve 'voip6.kolez.com'. Err=70018 (gethostbyname() has returned error (PJ_ERESOLVE))
17:28:24.051 tsx0x7f39e8003  ..Failed to send Request msg REGISTER/cseq=39256 (tdta0x7f39e8001d80)! err=70018 (gethostbyname() has returned error (PJ_ERESOLVE))
17:28:24.051    pjsua_acc.c  ....SIP registration failed, status=502 (gethostbyname() has returned error (PJ_ERESOLVE))
17:28:24.051    pjsua_acc.c  ....Scheduling re-registration retry for acc 0 in 303 seconds..
17:28:24.051      sip_reg.c  .Error sending request, status=70018
17:28:24.051    pjsua_acc.c  .Unable to create/send REGISTER: gethostbyname() has returned error (PJ_ERESOLVE) [status=70018]
17:28:24.051    pjsua_acc.c  Scheduling re-registration retry for acc 0 in 295 seconds..

Change History (21)

comment:1 by dimag, 8 years ago

Resolution: fixed
Status: newclosed

Сейчас при ошибке регистрации SIP-клиента в строке состояния диалога "Вход" будет выводиться сообщение "Не удалось инициализировать подсистему SIP".

comment:2 by alx, 8 years ago

Resolution: fixed
Status: closedreopened

Проблема по-прежнему присутствует. Регистрация на сервере не удалась, диагностика та же.
Сообщение "Не удалось инициализировать подсистему SIP" не вывелось.
Тикет переоткрыт.

Когда закрываете тикет с резолюцией fixed, указывайте, пожалуйста, в комментарии номер ревизии, в которой внесено исправление. Можно в комментарии к коммиту написать "Closes #xxx" или "Fixes #xxx", тогда svn автоматически закроет тикет xxx со ссылкой на коммит в комментарии.

comment:3 by dimag, 8 years ago

Как протестировать данную ошибку, у меня только IPv4 соединение.

in reply to:  3 comment:4 by alx, 8 years ago

Replying to dimag:

Как протестировать данную ошибку,

При подключении в качестве домена указать "voip6.kolez.com" - это имя резолвится в IPv6 адрес нашего коммутатора.

у меня только IPv4 соединение.

Не понял, что значит "только IPv4 соединение". Вот я указываю домен "voip6.kolez.com", и программа прекрасно соединяется с базой mysql по IPv6, затем также без проблем подключается к event-сокету коммутатора, а вот при регистрации на сервере - облом, почему-то говорит "Failed to resolve 'voip6.kolez.com'". Вот и надо выяснить, почему она (а точнее, PJSIP) не может отрезолвить это имя. Я предполагаю, что она запрашивает только A запись (которой у voip6.kolez.com нет), а AAAA - не запрашивает. Короче говоря, надо бы разобраться с проблемой и исправить...

comment:5 by dimag, 8 years ago

PJSIP использует функцию gethostbyname() из библиотеки Winsock.
В соответствие с MSDN
"If the host specified in the name parameter has both IPv4 and IPv6 addresses, only the IPv4 addresses will be returned.
--The gethostbyname function can only return IPv4 addresses for the name parameter.-- The getaddrinfo function and associated addrinfo structure should be used if IPv6 addresses for the host are required or if both IPv4 and IPv6 addresses for the host are required."
То есть PJSIP не может работать с IPv6 адресами.
Аналогично я не могу достучаться до voip6.kolez.com через ping, который судя по всему тоже использует gethostbyname.

comment:6 by dimag, 8 years ago

На данный момент поддержка одновременной работы с IPv4, IPv6 в PJSIP на стадии тестирования и не стабильна.

in reply to:  5 comment:7 by alx, 8 years ago

Replying to dimag:

PJSIP использует функцию gethostbyname() из библиотеки Winsock.

Хм... По-моему это не совсем так:

PJ_DEF(pj_status_t) pj_getaddrinfo(int af, const pj_str_t *nodename,
                                   unsigned *count, pj_addrinfo ai[])
{
#if defined(PJ_SOCK_HAS_GETADDRINFO) && PJ_SOCK_HAS_GETADDRINFO!=0
......
    rc = getaddrinfo(nodecopy, NULL, &hint, &res);
......
#else   /* PJ_SOCK_HAS_GETADDRINFO */
......
        status = pj_gethostbyname(nodename, &he);
......
#endif  /* PJ_SOCK_HAS_GETADDRINFO */

То есть gethostbyname() используется лишь как fallback для систем, в которых getaddrinfo() почему-то отсутствует.

То есть PJSIP не может работать с IPv6 адресами.

Только в системах, где нет getaddrinfo().

Аналогично я не могу достучаться до voip6.kolez.com через ping, который судя по всему тоже использует gethostbyname.

  1. А зачем пульту диспетчера ping?
  2. ping'у и не надо поддерживать IPv6, он для работы с протоколом ICMP6 не предназначен. Для ICMP6 есть утилита ping6.

in reply to:  6 comment:8 by alx, 8 years ago

Replying to dimag:

На данный момент поддержка одновременной работы с IPv4, IPv6 в PJSIP на стадии тестирования и не стабильна.

На основании какой информации Вы сделали такой вывод?

Я в их TRAC'е не вижу открытых тикетов, связанных с IPv6. Поддержка IPv6 реализована ГОДЫ тому назад (в-основном 8 лет назад, последняя существенная правка, касающаяся поддержки IPv6 - 4 года назад)...

comment:9 by dimag, 8 years ago

Прочитал в blog от одного из пользователей.

comment:10 by dimag, 8 years ago

Хотя может быть виноват не PJSIP, а сеть пользователя.
У меня вопрос зачем это надо, что работы с IPv6 мне надо будет перекомпилировать PJSIP, добавив в config_site.h строку #define PJ_HAS_IPV6 1?

comment:11 by dimag, 8 years ago

Вопрос к Александру, нам IPv6, так как наша программа будет работать в Intranetе заказчика по IPv4 протоколу?

in reply to:  10 comment:12 by alx, 8 years ago

Replying to dimag:

У меня вопрос зачем это надо, что работы с IPv6 мне надо будет перекомпилировать PJSIP, добавив в config_site.h строку #define PJ_HAS_IPV6 1?

Не понял вопрос... Зачем надо что?

comment:13 by san, 8 years ago

Я так понял Дима спрашивает: зачем нам IPv6?

А у заказчика наша программа будет работать как умеет :)

Поддержку IPv6 сделать не помешает, но задача не приоритетная. У тикета приоритет- минор

comment:14 by alx, 8 years ago

Когда разрабатывали протокол IP, не могли себе представить, насколько быстро будет расти Интернет. В результате этого, можно сказать, взрывного роста адреса IPv4 оказались исчерпаны (см. например здесь). В настоящее время Интернет не может расти и развиваться за счет адресов IPv4.

Как решение этой проблемы (а также ряда других проблем IPv4) более 20 лет назад был разработан новый протокол - IPv6. Кроме большого пространства адресов он имеет целый ряд других преимуществ по сравнению с IPм4 (например отсутствие широковещательных пакетов, автоматическая stateless конфигурация хостов в сети, отсутствие фрагментации и т.д.). Хотим мы этого или нет, а рано или поздно переходить на него придется. И если мы хотим производить продукт, который пользуется спросом, надо быть готовыми к тому, что его будут использовать в сети IPv6.

in reply to:  14 comment:15 by san, 8 years ago

Replying to alx:

Хотим мы этого или нет, а рано или поздно переходить на него придется. И если мы хотим производить продукт, который пользуется спросом, надо быть готовыми к тому, что его будут использовать в сети IPv6.

Согласен.

comment:16 by san, 8 years ago

Priority: minortrivial

comment:17 by dimag, 8 years ago

Keywords: IPv6 network added

Пока подожду.

comment:18 by alx, 7 years ago

In 837/dispatcher:

Если домен заключен в квадратные скобки ([]), считаем, что внутри них
адрес IPv6, и удаляем скобки прежде чем подключиться к mysql и esl.
See #184.

comment:19 by alx, 7 years ago

In 838/dispatcher:

Локальные адреса теперь получаем через pj_getdefaultipinterface(), а не собственным кодом.
Добавлено создание транспортов IPv6. See #184.

comment:20 by alx, 7 years ago

Resolution: fixed
Status: reopenedclosed

Формально, проблема решена в r837 - регистрация успешно выполняется.
Однако, есть другая проблема, не позволяющая работать с зарегистрированными таким образом пользователями. Но это уже, похоже, проблема pjsip, а не нашего пульта. Создам по этому поводу отдельный тикет.

comment:21 by san, 7 years ago

Milestone: Текущее2 очередь

Milestone renamed

Note: See TracTickets for help on using tickets.