Показаны сообщения с ярлыком patch. Показать все сообщения
Показаны сообщения с ярлыком patch. Показать все сообщения

05.01.2016

Realtime + register(row:callbackextension)+sip reload = Unregistered

Имеем проблему: если используем поле callbackextension в таблице Mysql и кол-во регистрации более 3-х, на меньшем не проявлялась, то при sip reload можем поиметь все регистрации со статусом Unregistered, помогает только рестарт * либо выгрузка/загрузка chan_sip.

Порывшись на просторах нашел вот это: https://issues.asterisk.org/jira/browse/ASTERISK-23789
на момент публикации еще открытый. Патч помогает, насколько он правильный судить не могу.

--- asterisk-12.2.0/channels/chan_sip.c 2014-04-21 17:02:00.000000000 -0400
+++ asterisk-12.2.0-modified/channels/chan_sip.c        2014-05-24 20:44:28.559519094 -0400
@@ -6566,8 +6566,12 @@
        AST_SCHED_DEL(sched, reg->expire);
        AST_SCHED_DEL(sched, reg->timeout);

+       if ((reg->;registryadded))
+       {
+               ast_atomic_fetchadd_int(&regobjs, -1);
+       }
+
        ast_string_field_free_memory(reg);
-       ast_atomic_fetchadd_int(&regobjs, -1);
        ast_free(reg);
 }

@@ -9556,6 +9560,7 @@
                registry_unref(tmp, "throw away found registry");
        } else {
                ast_atomic_fetchadd_int(&regobjs, 1);
+               reg->;registryadded = 1;
                ASTOBJ_CONTAINER_LINK(&regl, reg);
        }

--- asterisk-12.2.0/channels/sip/include/sip.h  2014-04-21 17:02:00.000000000 -0400
+++ asterisk-12.2.0-modified/channels/sip/include/sip.h 2014-05-24 20:37:42.557555124 -0400
@@ -1414,6 +1414,7 @@
        struct ast_sockaddr us;  /*!< Who the server thinks we are */
        int noncecount;         /*!< Nonce-count */
        char lastmsg[256];      /*!< Last Message sent/received */
+       unsigned short registryadded:1; /*!< If this registry object is already added to registry list */

 };

 struct tcptls_packet {
Update 10.01.2016
Порывшись еще найдено еще вот это: https://issues.asterisk.org/jira/browse/ASTERISK-23542
на момент публикации еще открытый.

--- channels/chan_sip.c    (revision 420532)
+++ channels/chan_sip.c    (working copy)
@@ -9218,11 +9218,12 @@
         reg->refresh = reg->expiry = reg->configured_expiry = default_expiry;
     }

+    ast_atomic_fetchadd_int(&regobjs, 1);
+
     /* Add the new registry entry to the list, but only if it isn't already there */
     if ((tmp = ASTOBJ_CONTAINER_FIND(&regl, reg->name))) {
         registry_unref(tmp, "throw away found registry");
     } else {
-        ast_atomic_fetchadd_int(&regobjs, 1);
         ASTOBJ_CONTAINER_LINK(&regl, reg);
     }


15.02.2015

Realtime + NAT

Наткнулся на  баг  в версии 11.6.0. описанный в ASTERISK-20572, сказано что пофиксили еще в версии 11.1.
 Патч не подходит.
Заменить в chan_sip.c строку:
  • if ((!found && !ast_test_flag(&global_flags[1], SIP_PAGE2_RTCACHEFRIENDS)) || !peer->host_dynamic) { 
 на:
  •  if (((!found && !ast_test_flag(&global_flags[1], SIP_PAGE2_RTCACHEFRIENDS)) || !peer->host_dynamic) && !realtime ) {
Но при выполнении входящего звонка на этот пир сразу после sip reload вызов проходить не будет так как пир появляется в кеше со статусом UNREACHABLE.
Как лечить пока не разобрался. В виде костыля можно уменьшить время регистрации до 120 секунд. Но для определенных клиентов это очень критично.

08.02.2015

chan_sip.c Asterisk 11

Для того что бы в лог выводились IP с которых пытаются подобрать пароль надо в chan_sip.c сделать замену  строки:
  • ast_log(LOG_NOTICE, "Failed to authenticate device %s\n", sip_get_header(req, "From"));
 на строку:
  • ast_log(LOG_NOTICE, "Failed to authenticate device %s [IP: %s]\n", sip_get_header(req, "From"), ast_sockaddr_stringify(addr));

В логах будет отображаться:
chan_sip.c: Failed to authenticate device 10<sip:10@XXX.XXX.XXX.XXX:5060>;tag=7d976289 [IP: 192.151.145.178:5078]