Использую CentOS 7 и Asterisk 1.8.32.3 без GUI.
Начали поднимать транк по IP до провайдера.
Вход работает, а вот исход отваливается с ошибкой 480.
Провайдер прислал дамп, в котором он отмечает отсутствие параметра "user=phone" в заголовке SIP в поле FROM.
Указание параметра usereqphone=yes в настройках транка добавляет сей параметр только в заголовок TO.
Пытался добавить в настройки самого пира (экстеншиона) - безрезультатно(
Со слов провайдера, их новая коммутационная платформа "Huawei" без этих параметров в заголовках FROM, TO, CONTACT просто футболит меня.
Много гуглил. Это либо "баг" и нужен патч или я не знаю уже что "подкрутить", чтобы данный параметр отображался в соответствующих полях.
Прикладываю трейс:
INVITE sip:XXXX@XXX.XXX.XXX.X:5060;user=phone SIP/2.0
Via: SIP/2.0/UDP XXX.XXX.X.X:5060;branch=z9hG4bK7bd447d7;rport
Max-Forwards: 70
From: "BLABLA" ;tag=as23b9d4c5 ; вот тут нет этого user=phone
To: ; вот тут появилось, соответственно, после добавления usereqphone=yes в описание транка
Contact: ; вот тут нет этого user=phone
Call-ID: 0c53df632fc4c2f122d0358e2f626784@XXX.XXX.X.X:5060
CSeq: 102 INVITE
User-Agent: Robocop
Date: Thu, 28 Jul 2016 14:33:39 GMT
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
Supported: replaces, timer
Content-Type: application/sdp
Content-Length: 314
Съезжать с 1.8.32 (а на что) или можно пропатчить, "подпилить" коллеги? Need Help
В chan_sip.c есть функция initreqprep, собственно в ней то и обрабатывается usereqphone и там же добавляют user=phone.
В функции есть коммент:
| Код: |
| const char *s = p->username; /* being a string field, cannot be NULL */ /* Test p->username against allowed characters in AST_DIGIT_ANY If it matches the allowed characters list, then sipuser = ";user=phone" If not, then sipuser = "" */ |
_________________
mega-net.ru - IT аутсорсинг
Просто не особо очевидно как его безболезненно поправить и можно ли это вообще делать(
После изучения логики функции, которая, вроде, должна подставлять user=phone
/* If we have only digits, add ;user=phone to the uri */
if (*s)
urioptions = ";user=phone"
в случае, если пир состоит из цифр, попробовал поименовать пир в сторону провайдера цифровыми значениями - результат такой же.
Съезжать на другую версию платформы из-за этого - ооооооооочень проблематично(((((((
| xelas @ Пт Июл 29, 2016 14:39 писал(а): |
| Может быть надо было исправить не имя пира а fromuser/defaultuser? |
Пир без регистрации, коллега(
Только по IP.
fromuser прописывается в настройках пира и к регистрации отношения не имеет.
Added after 3 minutes:
А при ближайшем рассмотрении находим еще и такую опцию в конфигурации пира:
| Цитата: |
| usereqphone = yes|no : Indicates whether to add a ";user=phone" to the URI. Default no. |
Первое - не помогает((((
Второе - я в своем посте писал, что этот параметр добавляет "user=phone" только в поле TO((((
Провайдер прислал трейс повторно, где выделил красным цветом поле FROM заголовка SIP-инвайта. И в нем нет параметра "user=phone", а в поле TO (как я и писал) - есть.
Якобы из-за этого коммутатор футболит инвайт.
Как сделать так, чтобы в это поле "лег" user=phone я уже не знаю....голова сломается скоро(((((((
По-прежнему нид хелп, коллеги!
Судя по форуму и баг трекеру Астериска эта проблема возникает с определенной периодичностью во всех ветках и только с определенным софтом на конце оператора.
Так что, либо менять оператора, либо одно из двух.
В любом случае, для версии 1.8 вы не найдете решения. EOL.
https://issues.asterisk.org/jira/browse/ASTERISK-24569?jql=text%20~%20%22user%3Dphone%22
https://community.asterisk.org/t/sip-usereqphone-yes-does-not-add-user-phone-in-from-header/44177/3
| megatron_dam писал(а): |
| в случае, если пир состоит из цифр |
С чего вы решили, что в p->username содержится название пира ? Мне вот так не кажется. Сделайте print содержимого этой переменной и тогда точно поймете что там.
| megatron_dam писал(а): |
| можно ли это вообще делать( |
Ну а почему нет то ? Если есть исходный код, то его можно править
| megatron_dam писал(а): |
| как его безболезненно поправить |
делаете виртуальную машину, на ней все обкатываете, а затем переносите на боевую систему. Либо ищите человека, который за денежку поправит за вас.
| xelas писал(а): |
| Так что, либо менять оператора, либо одно из двух. |
+1
_________________
mega-net.ru - IT аутсорсинг
Копи-паст оригинала.
Автор уверяет, что сие правит обсуждаемый эррор на ветке 11.
Я не особо силен в Сях, в институте ковырялся в последний раз(
Поможете разобрать? Символы + и - были в оригинале)
___________________
--- /tmp/asterisk-11.17.1/channels/chan_sip.c 2015-03-19 09:39:28.000000000 +0000
+++ channels/chan_sip.c 2015-04-21 12:32:08.954554855 +0000
@@ -13907,10 +13907,10 @@
if (!sip_standard_port(p->socket.type, ourport)) {
size_t offset = strlen(from);
- snprintf(&from[offset], sizeof(from) - offset, ";tag=%s", tmp_l, d, ourport, p->tag);
+ snprintf(&from[offset], sizeof(from) - offset, ";tag=%s", tmp_l, d, ourport, urioptions, p->tag);
} else {
size_t offset = strlen(from);
- snprintf(&from[offset], sizeof(from) - offset, ";tag=%s", tmp_l, d, p->tag);
+ snprintf(&from[offset], sizeof(from) - offset, ";tag=%s", tmp_l, d, urioptions, p->tag);
}
if (!ast_strlen_zero(explicit_uri)) {
__________________________
Между 11 и 1.8 версиями очень много времени прошло. И данный кусок кода может не соответствовать тому, что вы увидите в реальности.
_________________
платный суппорт по мере возможностей
awsswa, зачем переходить, если легко можно 1.8 допилить.
megatron_dam, вы выложили результат diff
Для 1.8 будет:
| Код: |
| [work:/usr/ports/net/asterisk/work/asterisk-1.8.23.1/channels/] diff -uN chan_sip.c.orig chan_sip.c |
| Код: |
| --- chan_sip.c.orig 2013-08-27 23:23:25.000000000 +0400 +++ chan_sip.c 2016-07-31 09:46:52.000000000 +0300 @@ -12527,9 +12527,9 @@ ourport = (p->fromdomainport) ? p->fromdomainport : ast_sockaddr_port(&p->ourip); if (!sip_standard_port(p->socket.type, ourport)) { - snprintf(from, sizeof(from), "\"%s\" ;tag=%s", n, tmp_l, d, ourport, p->tag); + snprintf(from, sizeof(from), "\"%s\" ;tag=%s", n, tmp_l, d, ourport, urioptions, p->tag); } else { - snprintf(from, sizeof(from), "\"%s\" ;tag=%s", n, tmp_l, d, p->tag); + snprintf(from, sizeof(from), "\"%s\" ;tag=%s", n, tmp_l, d, urioptions, p->tag); } if (!ast_strlen_zero(explicit_uri)) { |
Всего то надо добавить %s и urioptions.
Ну или вообще, кардинальный подход:
| Код: |
| --- chan_sip.c.orig 2013-08-27 23:23:25.000000000 +0400 +++ chan_sip.c 2016-07-31 09:46:52.000000000 +0300 @@ -12527,9 +12527,9 @@ ourport = (p->fromdomainport) ? p->fromdomainport : ast_sockaddr_port(&p->ourip); if (!sip_standard_port(p->socket.type, ourport)) { - snprintf(from, sizeof(from), "\"%s\" ;tag=%s", n, tmp_l, d, ourport, p->tag); + snprintf(from, sizeof(from), "\"%s\" ;tag=%s", n, tmp_l, d, ourport, p->tag); } else { - snprintf(from, sizeof(from), "\"%s\" ;tag=%s", n, tmp_l, d, p->tag); + snprintf(from, sizeof(from), "\"%s\" ;tag=%s", n, tmp_l, d, p->tag); } if (!ast_strlen_zero(explicit_uri)) { |
_________________
mega-net.ru - IT аутсорсинг
То ли я что-т не так делаю, то ли еще что.
Изменил файлик согласно порядку, пересобрал Астера..трейс провайдера по-прежнему показывает сие:
Via: SIP/2.0/UDP XXX.XXX.X.X:5060;branch=z9hG4bK7103005c;rport
Max-Forwards: 70
From: "TEST" ;tag=as78dee198
To:
Contact:
Call-ID: 5efae3307bbb98e705d8af3502cea0fb@XXX.XXX.X.X:5060
CSeq: 102 INVITE
User-Agent: Bla-bla
Date: Mon, 01 Aug 2016 07:38:11 GMT
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
Supported: replaces, timer
Content-Type: application/sdp
Content-Length: 312
Также прикладываю кусок получившегося кода:
ourport = (p->fromdomainport && (p->fromdomainport != STANDARD_SIP_PORT)) ? p->fromdomainport : ast_sockaddr_port(&p->ourip);
if (!sip_standard_port(p->socket.type, ourport)) {
snprintf(from, sizeof(from), "\"%s\" ;tag=%s", n, tmp_l, d, ourport, p->tag);
} else {
snprintf(from, sizeof(from), "\"%s\" ;tag=%s", n, tmp_l, d, p->tag);
}
if (!ast_strlen_zero(explicit_uri)) {
На вход все хорошо работает, но это не утишает))))
| megatron_dam писал(а): |
| Изменил файлик |
Ну а asterisk то вы пересобрали после этого ?
_________________
mega-net.ru - IT аутсорсинг
./configure и т.д.
Проверяю:
| Цитата: |
| INVITE sip:123@127.0.0.1 SIP/2.0 Via: SIP/2.0/UDP 127.0.0.1:5060;branch=z9hG4bK3b21679d;rport Max-Forwards: 70 From: "asterisk" ;tag=as341eb14a To: Contact: Call-ID: 43fd9cca0968754f6ad68f2a228ecae4@test.mega-net.ru CSeq: 102 INVITE User-Agent: test.mega-net.ru Date: Tue, 02 Aug 2016 06:12:50 GMT Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH Supported: replaces, timer Content-Type: application/sdp Content-Length: 259 |
Что я делаю не так ?
_________________
mega-net.ru - IT аутсорсинг
А вы какой "вариант" использовали? Тот, что радикальнее?))
Added after 1 hours:
| megatron_dam @ Вт Авг 02, 2016 10:06 писал(а): |
| Спасибо за фидбэк. Попробую еще раз. Что-то "паранормал" какой-то( А вы какой "вариант" использовали? Тот, что радикальнее?)) |
Всем большое спасибо за посильную помощь, коллеги.
Все завелось. В заголовках инвайтов необходимые поля помечены нужными "тэгами".
Только не понятно, почему сразу не завелось...только после второй пересборки(
Надеюсь, что наши происки будут кому-то еще полезными!
| megatron_dam писал(а): |
| А вы какой "вариант" использовали? |
Я использовал тот вариант, который вы указали в этом своем посте, т.е. радикальный. Если бы вы делали менее радикальный, то и я бы тоже тестил его же. Иначе какой смысл пробовать разные варианты и сравнивать полученные результаты ?
| megatron_dam писал(а): |
| не понятно, почему сразу не завелось... |
Это можно осознать только в одном случае: в точности воспроизведя порядок совершенных действий и результатов проверок после этих действий.
Например самое простое для проверки это смотреть изменился ли размер файла модуля chan_sip.so после ваших действий по пересборке или нет. Если не изменился, то вывод сразу очевиден и дальнейшие тесты бессмысленны.
_________________
mega-net.ru - IT аутсорсинг
| Код: |
| diff --git a/channels/chan_sip.c b/channels/chan_sip.c index c35091f..2362617 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -13921,9 +13921,9 @@ static void initreqprep(struct sip_request *req, struct sip_pvt *p, int sipmetho ourport = (p->fromdomainport && (p->fromdomainport != STANDARD_SIP_PORT)) ? p->fromdomainport : ast_sockaddr_port(&p->ourip); if (!sip_standard_port(p->socket.type, ourport)) { - ret = ast_str_set(&from, 0, ";tag=%s", tmp_l, d, ourport, p->tag); + ret = ast_str_set(&from, 0, ";tag=%s", tmp_l, d, ourport, urioptions, p->tag); } else { - ret = ast_str_set(&from, 0, ";tag=%s", tmp_l, d, p->tag); + ret = ast_str_set(&from, 0, ";tag=%s", tmp_l, d, urioptions, p->tag); } if (ret == AST_DYNSTR_BUILD_FAILED) { /* We don't have an escape path from here... */ |
_________________
dCAP #2147