FreeSWITCH 的 soa 问题

soa = sdp offer answer

可以修改 sip profile 配置文件,关闭 soa

<param name="enable-soa" value="0"/>

也可以定义通道变量,关闭 soa

<action application="set" data="sip_enable_soa=false"/>

此外,mod_sofia 内部有时会自动关闭 soa

比如下面这段代码:

    if ((mp = sofia_media_get_multipart(session, "sip_multipart", tech_pvt->mparams.local_sdp_str, &mp_type))) {
        sofia_clear_flag(tech_pvt, TFLAG_ENABLE_SOA);
    }

如果检查到 multipart, libsofia 明显不支持,那怎么办,那就关闭 soa

再看下 sofia_glue_do_invite 的实现,应该就知道了:

    if (sofia_use_soa(tech_pvt)) {
        nua_invite(tech_pvt->nh,
                   NUTAG_AUTOANSWER(0),
                   //TAG_IF(zstr(tech_pvt->mparams.local_sdp_str), NUTAG_AUTOACK(0)),
                   //TAG_IF(!zstr(tech_pvt->mparams.local_sdp_str), NUTAG_AUTOACK(1)),
                   // The code above is breaking things...... grrr WE need this because we handle our own acks and there are 3pcc cases in there too
                   NUTAG_AUTOACK(0),
                   NUTAG_SESSION_TIMER(tech_pvt->session_timeout),
                   NUTAG_SESSION_REFRESHER(tech_pvt->session_refresher),
                   NUTAG_UPDATE_REFRESH(tech_pvt->update_refresher),
                   TAG_IF(!zstr(session_id_header), SIPTAG_HEADER_STR(session_id_header)),
                   TAG_IF(sofia_test_flag(tech_pvt, TFLAG_RECOVERED), NUTAG_INVITE_TIMER(UINT_MAX)),
                   TAG_IF(invite_full_from, SIPTAG_FROM_STR(invite_full_from)),
                   TAG_IF(invite_full_to, SIPTAG_TO_STR(invite_full_to)),
                   TAG_IF(tech_pvt->redirected, NUTAG_URL(tech_pvt->redirected)),
                   TAG_IF(!zstr(recover_via), SIPTAG_VIA_STR(recover_via)),
                   TAG_IF(!zstr(tech_pvt->user_via), SIPTAG_VIA_STR(tech_pvt->user_via)),
                   TAG_IF(!zstr(tech_pvt->rpid), SIPTAG_REMOTE_PARTY_ID_STR(tech_pvt->rpid)),
                   TAG_IF(!zstr(tech_pvt->preferred_id), SIPTAG_P_PREFERRED_IDENTITY_STR(tech_pvt->preferred_id)),
                   TAG_IF(!zstr(tech_pvt->asserted_id), SIPTAG_P_ASSERTED_IDENTITY_STR(tech_pvt->asserted_id)),
                   TAG_IF(!zstr(tech_pvt->privacy), SIPTAG_PRIVACY_STR(tech_pvt->privacy)),
                   TAG_IF(!zstr(identity), SIPTAG_IDENTITY_STR(identity)),
                   TAG_IF(!zstr(date), SIPTAG_DATE_STR(date)),
                   TAG_IF(!zstr(alert_info), SIPTAG_HEADER_STR(alert_info)),
                   TAG_IF(!zstr(extra_headers), SIPTAG_HEADER_STR(extra_headers)),
                   TAG_IF(sofia_test_pflag(tech_pvt->profile, PFLAG_PASS_CALLEE_ID), SIPTAG_HEADER_STR("X-FS-Support: " FREESWITCH_SUPPORT)),
                   TAG_IF(!zstr(max_forwards), SIPTAG_MAX_FORWARDS_STR(max_forwards)),
                   TAG_IF(!zstr(route_uri), NUTAG_PROXY(route_uri)),
                   TAG_IF(!zstr(invite_route_uri), NUTAG_INITIAL_ROUTE_STR(invite_route_uri)),
                   TAG_IF(!zstr(route), SIPTAG_ROUTE_STR(route)),
                   TAG_IF(tech_pvt->profile->minimum_session_expires, NUTAG_MIN_SE(tech_pvt->profile->minimum_session_expires)),
                   TAG_IF(cseq, SIPTAG_CSEQ(cseq)),
                   TAG_IF(content_encoding, SIPTAG_CONTENT_ENCODING_STR(content_encoding)),
                   TAG_IF(zstr(tech_pvt->mparams.local_sdp_str), SIPTAG_PAYLOAD_STR("")),
                   TAG_IF(!zstr(tech_pvt->mparams.local_sdp_str), SOATAG_ADDRESS(tech_pvt->mparams.adv_sdp_audio_ip)),
                   TAG_IF(!zstr(tech_pvt->mparams.local_sdp_str), SOATAG_USER_SDP_STR(tech_pvt->mparams.local_sdp_str)),
                   TAG_IF(!zstr(tech_pvt->mparams.local_sdp_str), SOATAG_REUSE_REJECTED(1)),
                   TAG_IF(is_t38, SOATAG_ORDERED_USER(1)),
                   TAG_IF(!zstr(tech_pvt->mparams.local_sdp_str), SOATAG_RTP_SORT(SOA_RTP_SORT_REMOTE)),
                   TAG_IF(!zstr(tech_pvt->mparams.local_sdp_str), SOATAG_RTP_SELECT(SOA_RTP_SELECT_ALL)),
                   TAG_IF(rep, SIPTAG_REPLACES_STR(rep)),
                   TAG_IF(!require_timer, NUTAG_TIMER_AUTOREQUIRE(0)),
                   TAG_IF(!zstr(tech_pvt->mparams.local_sdp_str), SOATAG_HOLD(holdstr)), TAG_END());
    } else {
        nua_invite(tech_pvt->nh,
                   NUTAG_AUTOANSWER(0),
                   NUTAG_AUTOACK(0),
                   NUTAG_SESSION_TIMER(tech_pvt->session_timeout),
                   NUTAG_SESSION_REFRESHER(tech_pvt->session_refresher),
                   NUTAG_UPDATE_REFRESH(tech_pvt->update_refresher),
                   TAG_IF(!zstr(session_id_header), SIPTAG_HEADER_STR(session_id_header)),
                   TAG_IF(sofia_test_flag(tech_pvt, TFLAG_RECOVERED), NUTAG_INVITE_TIMER(UINT_MAX)),
                   TAG_IF(invite_full_from, SIPTAG_FROM_STR(invite_full_from)),
                   TAG_IF(invite_full_to, SIPTAG_TO_STR(invite_full_to)),
                   TAG_IF(tech_pvt->redirected, NUTAG_URL(tech_pvt->redirected)),
                   TAG_IF(!zstr(recover_via), SIPTAG_VIA_STR(recover_via)),
                   TAG_IF(!zstr(tech_pvt->user_via), SIPTAG_VIA_STR(tech_pvt->user_via)),
                   TAG_IF(!zstr(tech_pvt->rpid), SIPTAG_REMOTE_PARTY_ID_STR(tech_pvt->rpid)),
                   TAG_IF(!zstr(tech_pvt->preferred_id), SIPTAG_P_PREFERRED_IDENTITY_STR(tech_pvt->preferred_id)),
                   TAG_IF(!zstr(tech_pvt->asserted_id), SIPTAG_P_ASSERTED_IDENTITY_STR(tech_pvt->asserted_id)),
                   TAG_IF(!zstr(tech_pvt->privacy), SIPTAG_PRIVACY_STR(tech_pvt->privacy)),
                   TAG_IF(!zstr(alert_info), SIPTAG_HEADER_STR(alert_info)),
                   TAG_IF(!zstr(extra_headers), SIPTAG_HEADER_STR(extra_headers)),
                   TAG_IF(sofia_test_pflag(tech_pvt->profile, PFLAG_PASS_CALLEE_ID), SIPTAG_HEADER_STR("X-FS-Support: " FREESWITCH_SUPPORT)),
                   TAG_IF(!zstr(max_forwards), SIPTAG_MAX_FORWARDS_STR(max_forwards)),
                   TAG_IF(!zstr(identity), SIPTAG_IDENTITY_STR(identity)),
                   TAG_IF(!zstr(route_uri), NUTAG_PROXY(route_uri)),
                   TAG_IF(!zstr(route), SIPTAG_ROUTE_STR(route)),
                   TAG_IF(!zstr(invite_route_uri), NUTAG_INITIAL_ROUTE_STR(invite_route_uri)),
                   TAG_IF(tech_pvt->profile->minimum_session_expires, NUTAG_MIN_SE(tech_pvt->profile->minimum_session_expires)),
                   TAG_IF(!require_timer, NUTAG_TIMER_AUTOREQUIRE(0)),
                   TAG_IF(cseq, SIPTAG_CSEQ(cseq)),
                   TAG_IF(content_encoding, SIPTAG_CONTENT_ENCODING_STR(content_encoding)),
                   NUTAG_MEDIA_ENABLE(0),
                   SIPTAG_CONTENT_TYPE_STR(mp_type ? mp_type : "application/sdp"),
                   SIPTAG_PAYLOAD_STR(mp ? mp : tech_pvt->mparams.local_sdp_str), TAG_IF(rep, SIPTAG_REPLACES_STR(rep)), SOATAG_HOLD(holdstr), TAG_END());
    }
 

if 容易理解

else 里面 NUTAG_MEDIA_ENABLE(0),这个标签真正起了作用,关闭了 libsofia 的 soa


除了 multipart,还有哪些情况下 mod_sofia 会自动关闭 soa 呢?

至少有这些:

1. 3pcc

2. 传真

那么什么情况下需要修改配置,关闭 soa 呢?

有些 srtp 场景下 libsofia soa 支持的不好,需要明确修改配置文件

可能还有其他情况,请知情者补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值