Asterisk 13.10 + pjsip + WebRTC - Rx 缓冲区溢出 (PJSIP_ERXOVERFLOW)
Asterisk 13.10 + pjsip + WebRTC - Rx buffer overflow (PJSIP_ERXOVERFLOW)
在测试了几天 pjsip 之后,我终于明白了它是如何工作的。我希望它能帮助我从站点进行 WebRTC 调用。
情况:
- 我可以用 Asterisk 拨打和接听普通电话
- 对于 WebRTC,我尝试了 sipml5、Sip.js、JsSIP(目前使用 sipml5)
- sipml5 连接到我的服务器(有 "Connected")
这是 pjsip "webrtc" 配置(目前):
[webrtc]
type=endpoint
transport=transport-udp
context=webrtc
disallow=all
allow=alaw
allow=ulaw
dtls_cert_file=/etc/letsencrypt/live/example.org/fullchain.pem
dtls_private_key=/etc/letsencrypt/live/example.org/privkey.pem
auth=webrtc
aors=webrtc
use_avpf=yes
direct_media=no
[webrtc]
type=aor
contact=sip:webrtc@example.org:5060
max_contacts=1000
outbound_proxy=sip:example.org
[webrtc]
type=auth
auth_type=userpass
username=webrtc
password=psswd
realm=example.org
调用时出现问题:
[Sep 1 17:50:37] ERROR[7760] pjproject: sip_endpoint.c Error processing packet from 127.0.0.1:57928: Rx buffer overflow (PJSIP_ERXOVERFLOW) [code 171062]:
INVITE sip:1@example.org SIP/2.0
Via: SIP/2.0/WSS df7jal23ls0d.invalid;branch=z9hG4bKX7Ng7L0OKRBkpUqGlHPV4GfxO0I7d93i;rport
From: <sip:webrtc@example.org>;tag=ypLlm1BDxPkn8aTTkVJL
To: <sip:1@example.org>
Contact: <sips:webrtc@df7jal23ls0d.invalid;rtcweb-breaker=no;click2call=no;transport=wss>;+g.oma.sip-im;language="en,fr"
Call-ID: 30f526f4-3c4f-e96f-391d-39290b9dc983
CSeq: 60845 INVITE
Content-Type: application/sdp
Content-Length: 3621
Max-Forwards: 70
User-Agent: IM-client/OMA1.0 sipML5-v1.2016.03.04
Organization: Doubango Telecom
v=0
o=- 8456797239022316000 2 IN IP4 127.0.0.1
s=Doubango Telecom - chrome
t=0 0
a=group:BUNDLE audio
a=msid-semantic: WMS gVGmhQ6UmwynNn99UhRNBJJjcV5AqYkpNF3M
m=audio 47942 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126
c=IN IP4 ...
...
a=ice-ufrag:B0dVeWHjfVOT/n0s
a=ice-pwd:BP5DshTjqBa4CqBiZSb8ZpNp
a=fingerprint:sha-256 5B:41:25:27:9E:AD:F2:E9:F2:0A:D6:26:CF:FA:5A:C7:F3:7B:B6:35:32:9A:CF:04:35:2B:07:DB:A1:8F:2E:FD
a=setup:actpass
a=mid:audio
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=sendrecv
a=rtcp-mux
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
a=rtpmap:9 G722/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:106 CN/32000
a=rtpmap:105 CN/16000
a=rtpmap:13 CN/8000
a=rtp
为什么会这样?任务很简单:只需对最简单的 Asterisk 扩展程序进行 webrtc 调用 (Playback(demo-congrats)
)
PS:我用 Nginx 代理 /ws
,这就是为什么它在 Error processing packet from 127.0.0.1:57928
.
中是 127.0.0.1
求解:
vim third-party/pjproject/patches/config_site.h
/* #define PJSIP_MAX_PKT_LEN 6000 */
#define PJ_ICE_MAX_CAND 32
#define PJ_ICE_MAX_CHECKS (PJ_ICE_MAX_CAND * 16)
#define PJSIP_MAX_PKT_LEN 12288
./configure --with-pjproject-bundled
make
make install
pjsip 具有最大数据包大小,WebRTC SDP 可以超过该大小。您可以按照以下步骤进行修复:
- 在
include/pj/
下的 pjsip 源代码分发中找到(或创建)config_site.h
添加(或设置)以下定义以增加最大消息大小:#define PJSIP_MAX_PKT_LEN 12288
。该文件的完整示例可能如下所示:
#ifndef __PJ_CONFIG_SITE_H__
#define __PJ_CONFIG_SITE_H__
#define PJ_ICE_MAX_CAND 32
#define PJ_ICE_MAX_CHECKS (PJ_ICE_MAX_CAND * 16)
#define PJSIP_MAX_PKT_LEN 12288
#endif /* __PJ_CONFIG_SITE_H__ */
注意:我还为 WebRTC 设置了一些其他合理的设置,以帮助确保您也不会在 ice 候选人上达到限制。
- 重新编译pjsip
- 重新编译asterisk
在测试了几天 pjsip 之后,我终于明白了它是如何工作的。我希望它能帮助我从站点进行 WebRTC 调用。
情况:
- 我可以用 Asterisk 拨打和接听普通电话
- 对于 WebRTC,我尝试了 sipml5、Sip.js、JsSIP(目前使用 sipml5)
- sipml5 连接到我的服务器(有 "Connected")
这是 pjsip "webrtc" 配置(目前):
[webrtc]
type=endpoint
transport=transport-udp
context=webrtc
disallow=all
allow=alaw
allow=ulaw
dtls_cert_file=/etc/letsencrypt/live/example.org/fullchain.pem
dtls_private_key=/etc/letsencrypt/live/example.org/privkey.pem
auth=webrtc
aors=webrtc
use_avpf=yes
direct_media=no
[webrtc]
type=aor
contact=sip:webrtc@example.org:5060
max_contacts=1000
outbound_proxy=sip:example.org
[webrtc]
type=auth
auth_type=userpass
username=webrtc
password=psswd
realm=example.org
调用时出现问题:
[Sep 1 17:50:37] ERROR[7760] pjproject: sip_endpoint.c Error processing packet from 127.0.0.1:57928: Rx buffer overflow (PJSIP_ERXOVERFLOW) [code 171062]:
INVITE sip:1@example.org SIP/2.0
Via: SIP/2.0/WSS df7jal23ls0d.invalid;branch=z9hG4bKX7Ng7L0OKRBkpUqGlHPV4GfxO0I7d93i;rport
From: <sip:webrtc@example.org>;tag=ypLlm1BDxPkn8aTTkVJL
To: <sip:1@example.org>
Contact: <sips:webrtc@df7jal23ls0d.invalid;rtcweb-breaker=no;click2call=no;transport=wss>;+g.oma.sip-im;language="en,fr"
Call-ID: 30f526f4-3c4f-e96f-391d-39290b9dc983
CSeq: 60845 INVITE
Content-Type: application/sdp
Content-Length: 3621
Max-Forwards: 70
User-Agent: IM-client/OMA1.0 sipML5-v1.2016.03.04
Organization: Doubango Telecom
v=0
o=- 8456797239022316000 2 IN IP4 127.0.0.1
s=Doubango Telecom - chrome
t=0 0
a=group:BUNDLE audio
a=msid-semantic: WMS gVGmhQ6UmwynNn99UhRNBJJjcV5AqYkpNF3M
m=audio 47942 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126
c=IN IP4 ...
...
a=ice-ufrag:B0dVeWHjfVOT/n0s
a=ice-pwd:BP5DshTjqBa4CqBiZSb8ZpNp
a=fingerprint:sha-256 5B:41:25:27:9E:AD:F2:E9:F2:0A:D6:26:CF:FA:5A:C7:F3:7B:B6:35:32:9A:CF:04:35:2B:07:DB:A1:8F:2E:FD
a=setup:actpass
a=mid:audio
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=sendrecv
a=rtcp-mux
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
a=rtpmap:9 G722/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:106 CN/32000
a=rtpmap:105 CN/16000
a=rtpmap:13 CN/8000
a=rtp
为什么会这样?任务很简单:只需对最简单的 Asterisk 扩展程序进行 webrtc 调用 (Playback(demo-congrats)
)
PS:我用 Nginx 代理 /ws
,这就是为什么它在 Error processing packet from 127.0.0.1:57928
.
求解:
vim third-party/pjproject/patches/config_site.h
/* #define PJSIP_MAX_PKT_LEN 6000 */
#define PJ_ICE_MAX_CAND 32
#define PJ_ICE_MAX_CHECKS (PJ_ICE_MAX_CAND * 16)
#define PJSIP_MAX_PKT_LEN 12288
./configure --with-pjproject-bundled
make
make install
pjsip 具有最大数据包大小,WebRTC SDP 可以超过该大小。您可以按照以下步骤进行修复:
- 在
include/pj/
下的 pjsip 源代码分发中找到(或创建) 添加(或设置)以下定义以增加最大消息大小:
#define PJSIP_MAX_PKT_LEN 12288
。该文件的完整示例可能如下所示:#ifndef __PJ_CONFIG_SITE_H__ #define __PJ_CONFIG_SITE_H__ #define PJ_ICE_MAX_CAND 32 #define PJ_ICE_MAX_CHECKS (PJ_ICE_MAX_CAND * 16) #define PJSIP_MAX_PKT_LEN 12288 #endif /* __PJ_CONFIG_SITE_H__ */
注意:我还为 WebRTC 设置了一些其他合理的设置,以帮助确保您也不会在 ice 候选人上达到限制。
- 重新编译pjsip
- 重新编译asterisk
config_site.h