asterisk 1.6.0.5
ubutu 8.04.2
городской телефон по сипу от уралсвязьинформа.
Проблемма:
при звонках на сип телефон с городских цифровых АТС слышимость в одну сторону.
Дебаг SIP и RTP показал сл:
SIP
| Код: |
| v=0 o=MG2K5_731_25_4 2278744009 2278744009 IN IP4 62.148.237.201 s=- p=+7 t=0 0 m=audio 54690 RTP/AVP 8 c=IN IP4 62.148.237.201 a=ptime:20 m=image 0 udptl t38 c=IN IP4 10.104.12.136 |
RTP
| Код: |
| Sent RTP P2P packet to 10.104.12.136:44778 (type 08, len 000320) Sent RTP P2P packet to my_ext_IP:50000 (type 08, len 000160) |
Разговор с тех поддержкой:
Они знают про проблеммы с asterisk и с этими станциями. Говорят что мы официально не поддержываем ОперСурс, и официально не поддерживаем t38, но всетаки он есть....И внятного ответа какого лешего ко мне на * попадает их внутренний IP 10.104.12.136 не смогли дать.
Перекрутил все кодеки, прочитал кучу мануалов но так ничего внятного и не нашел.
Кто и как решил эту проблемму?
| Код: |
| INVITE sip:s@my_Ext_IP:5060;maddr=my_Ext_IP SIP/2.0 From: ;tag=-45026-196882b-63575b2f-196882b To: "my_Name my_Name" Call-ID: e493d905325d69a7120e85ec6be545465df30dd@62.148.237.132 CSeq: 1 INVITE Via: SIP/2.0/UDP 62.148.237.132:5060;branch=z9hG4bK-178bac2-bf998818-76ce42a0 content-type: application/sdp contact: user-agent: CS2000_NGSS/9.0 max-forwards: 69 supported: com.nortelnetworks.firewall,p-3rdpartycontrol,nosec,join remote-party-id: ;screen=yes;party=calling;privacy=off allow: ACK,REFER allow: BYE allow: CANCEL allow: INVITE allow: OPTIONS allow: INFO allow: SUBSCRIBE allow: REFER allow: NOTIFY allow: PRACK allow: UPDATE x-nt-corr-id: a493d90532d0faa7120e85ee4ffbe78c8e349bb@62.148.237.132 x-nt-location: 193624 privacy: none Content-Length: 147 v=0 o=MG2K5_731_25_4 2278744002 2278744002 IN IP4 62.148.237.201 s=- p=+7 t=0 0 m=audio 54690 RTP/AVP 8 c=IN IP4 62.148.237.201 a=ptime:20 |
а это после того как я поднимаю трубку на IP телефоне (dlink DPH-150SE)
| Код: |
| INVITE sip:s@my_Ext_IP SIP/2.0 From: ;tag=-45026-196882b-63575b2f-196882b To: "my_Name my_Name";tag=as521b003b Call-ID: e493d905325d69a7120e85ec6be545465df30dd@62.148.237.132 CSeq: 2 INVITE Via: SIP/2.0/UDP 62.148.237.132:5060;branch=z9hG4bK-178baca-bf99a5df-2380151f content-type: application/sdp contact: user-agent: CS2000_NGSS/9.0 max-forwards: 69 supported: com.nortelnetworks.firewall,p-3rdpartycontrol,nosec,join allow: ACK,REFER allow: BYE allow: CANCEL allow: INVITE allow: OPTIONS allow: INFO allow: SUBSCRIBE allow: REFER allow: NOTIFY allow: PRACK allow: UPDATE x-nt-corr-id: a493d90532d0faa7120e85ee4ffbe78c8e349bb@62.148.237.132 x-nt-location: 193624 Content-Length: 192 v=0 o=MG2K5_731_25_4 2278744009 2278744009 IN IP4 62.148.237.201 s=- p=+7 t=0 0 m=audio 54690 RTP/AVP 8 c=IN IP4 62.148.237.201 a=ptime:20 m=image 0 udptl t38 c=IN IP4 10.104.12.136 |
С другой стороны t38 с этим провом НЕ ЗАРАБОТАЕТ по тем же причинам. Так что можно продолжать любовную переписку с тех. саппортом
Можно попробовать побаловаться с параметром nat, но тут без гарантий - как уж * отработает =)
или nat=no
вы про это?
я думаю еще можно сделать вариант в iptables прописать "проброс" c 10.104.12.136 на IP провайдера.
есть ли вариант вообще отключить t38 ???
| Zmiy писал(а): |
| вы про это? |
Отключать t38 безсмысленно я думаю, хотя можно поставить t38udptl= no (в названии параметра могу ошибаться).
Проброс конечно тоже вариант, но уж больно костыльно выглядит, ИМХО.
v=0
o=MG2K5_731_25_4 2278744009 2278744009 IN IP4 62.148.237.201
s=-
p=+7
t=0 0
m=audio 54690 RTP/AVP 8
c=IN IP4 62.148.237.201
a=ptime:20
m=image 0 udptl t38
c=IN IP4 10.104.12.136
рассмотрел функцию get_ip_and_port_from_sdp из chan_sip.c
| Код: |
| 05238 c = get_sdp_iterate(&citerator, req, "c"); 05239 if (sscanf(c, "IN IP4 %256s", host) != 1) { 05240 ast_log(LOG_WARNING, "Invalid host in c= line, '%s'\n", c); 05241 /* Continue since there may be a valid host in a c= line specific to the audio stream */ 05242 } 05243 /* We only want the m and c lines for audio */ 05244 for (m = get_sdp_iterate(&miterator, req, "m"); !ast_strlen_zero(m); m = get_sdp_iterate(&miterator, req, "m")) { 05245 if ((media == SDP_AUDIO && ((sscanf(m, "audio %30d/%30d RTP/AVP %n", &x, &numberofports, &len) == 2 && len > 0) || 05246 (sscanf(m, "audio %30d RTP/AVP %n", &x, &len) == 1 && len > 0))) || 05247 (media == SDP_VIDEO && ((sscanf(m, "video %30d/%30d RTP/AVP %n", &x, &numberofports, &len) == 2 && len > 0) || 05248 (sscanf(m, "video %30d RTP/AVP %n", &x, &len) == 1 && len > 0)))) { 05249 /* See if there's a c= line for this media stream. 05250 * XXX There is no guarantee that we'll be grabbing the c= line for this 05251 * particular media stream here. However, this is the same logic used in process_sdp. 05252 */ 05253 c = get_sdp_iterate(&citerator, req, "c"); 05254 if (!ast_strlen_zero(c)) { 05255 sscanf(c, "IN IP4 %256s", host); 05256 } 05257 break; 05258 } 05259 } |
получается что он первый раз читает заголовок находит что есть параметр с, определяется переменная host. а потом второй раз ищет, НО уже первое объявление с он не видит.
Только не понятно нафига это сделано?
На первый взгляд, логика обработки полей SDP верная. Но может быть я чего-то не вижу
а вот если это баг в астериске то можно и поправить.
_________________
нанотехнолигии в области Asterisk
т.е. как понимаю есть 2 решения.
1. это на уровне фарвола
2. на уровне кода.
Я пожалуй второй выберу...
А продвигают свои бренды. В общем сговор телекома и поставщиков.