AF
Asterisk Forum
обсуждения телефонии, VoIP и IP-PBX
12разделов
5 423тем
34 385сообщений
← К списку тем

Отсутствие поля "user=phone" в заголовке From

Asterisk IP PBX 20 сообщений -
#1

Коллеги, доброго времени суток.
Использую 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
#2

Не зачем съезжать. Зайти и если надо, то попробовать поправить собственными ручками.
В 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 аутсорсинг
#3

Спасибо за совет.
Просто не особо очевидно как его безболезненно поправить и можно ли это вообще делать(
После изучения логики функции, которая, вроде, должна подставлять user=phone
/* If we have only digits, add ;user=phone to the uri */
if (*s)
urioptions = ";user=phone"

в случае, если пир состоит из цифр, попробовал поименовать пир в сторону провайдера цифровыми значениями - результат такой же.
Съезжать на другую версию платформы из-за этого - ооооооооочень проблематично((((((( Crying or Very sad
#4

Может быть надо было исправить не имя пира а fromuser/defaultuser?
#5

xelas @ Пт Июл 29, 2016 14:39 писал(а):
Может быть надо было исправить не имя пира а fromuser/defaultuser?


Пир без регистрации, коллега(
Только по IP.
#6

И что?
fromuser прописывается в настройках пира и к регистрации отношения не имеет.

Added after 3 minutes:

А при ближайшем рассмотрении находим еще и такую опцию в конфигурации пира:
Цитата:

usereqphone = yes|no : Indicates whether to add a ";user=phone" to the URI. Default no.
#7

xelas @ Пт Июл 29, 2016 14:59 писал(а):
И что?
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 я уже не знаю....голова сломается скоро(((((((
По-прежнему нид хелп, коллеги!
#8

Кроме как поправить руками код -- никак.
Судя по форуму и баг трекеру Астериска эта проблема возникает с определенной периодичностью во всех ветках и только с определенным софтом на конце оператора.
Так что, либо менять оператора, либо одно из двух.
В любом случае, для версии 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
#9

megatron_dam писал(а):
в случае, если пир состоит из цифр

С чего вы решили, что в p->username содержится название пира ? Мне вот так не кажется. Сделайте print содержимого этой переменной и тогда точно поймете что там.
megatron_dam писал(а):
можно ли это вообще делать(

Ну а почему нет то ? Если есть исходный код, то его можно править Smile
megatron_dam писал(а):
как его безболезненно поправить

делаете виртуальную машину, на ней все обкатываете, а затем переносите на боевую систему. Либо ищите человека, который за денежку поправит за вас.
xelas писал(а):
Так что, либо менять оператора, либо одно из двух.

+1

_________________
mega-net.ru - IT аутсорсинг
#10

Нашел вот это, коллеги!
Копи-паст оригинала.
Автор уверяет, что сие правит обсуждаемый эррор на ветке 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

Символы - и + означают, что строка удаляется и добавляется.
Между 11 и 1.8 версиями очень много времени прошло. И данный кусок кода может не соответствовать тому, что вы увидите в реальности.
#12

что мешает перейти на 11 ветку и патч накатить ?
_________________
платный суппорт по мере возможностей
#13

xelas прав и патч для 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)) {

Smile

_________________
mega-net.ru - IT аутсорсинг
#14

Коллеги, всем большое спасибо.
То ли я что-т не так делаю, то ли еще что.
Изменил файлик согласно порядку, пересобрал Астера..трейс провайдера по-прежнему показывает сие:


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)) {

На вход все хорошо работает, но это не утишает))))
#15

megatron_dam писал(а):
Изменил файлик

Ну а asterisk то вы пересобрали после этого ?

_________________
mega-net.ru - IT аутсорсинг
#16

Да, как положено я написал об этом...
./configure и т.д.
#17

Применил патч, пересобрал, перезапустил.
Проверяю:
Цитата:
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

Что я делаю не так ? Smile А точнее все же это вы что-то делаете не так.

_________________
mega-net.ru - IT аутсорсинг
#18

Спасибо за фидбэк. Попробую еще раз. Что-то "паранормал" какой-то(
А вы какой "вариант" использовали? Тот, что радикальнее?))

Added after 1 hours:

megatron_dam @ Вт Авг 02, 2016 10:06 писал(а):
Спасибо за фидбэк. Попробую еще раз. Что-то "паранормал" какой-то(
А вы какой "вариант" использовали? Тот, что радикальнее?))

Всем большое спасибо за посильную помощь, коллеги.
Все завелось. В заголовках инвайтов необходимые поля помечены нужными "тэгами".
Только не понятно, почему сразу не завелось...только после второй пересборки(
Надеюсь, что наши происки будут кому-то еще полезными!
#19

megatron_dam писал(а):
А вы какой "вариант" использовали?

Я использовал тот вариант, который вы указали в этом своем посте, т.е. радикальный. Если бы вы делали менее радикальный, то и я бы тоже тестил его же. Иначе какой смысл пробовать разные варианты и сравнивать полученные результаты ?
megatron_dam писал(а):
не понятно, почему сразу не завелось...

Это можно осознать только в одном случае: в точности воспроизведя порядок совершенных действий и результатов проверок после этих действий.
Например самое простое для проверки это смотреть изменился ли размер файла модуля chan_sip.so после ваших действий по пересборке или нет. Если не изменился, то вывод сразу очевиден и дальнейшие тесты бессмысленны.

_________________
mega-net.ru - IT аутсорсинг
#20

Патч для 11.23:
Код:
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