天天看點

将Freeswitch SDP 固定為 external_rtp_ip

在使用SIP注冊代理的場景中,經常遇到 FS向注冊代理伺服器請求外呼時,由于注冊代理伺服器的位址為内網,是以FS的請求SDP會自動切換為内網,這是使得FS的媒體不能直接和用戶端進行RTP通信。

是以有些場景會需要FS固定SDP為公網位址,代理伺服器進行媒體繞過,FS直接和用戶端進行媒體通信。

增加一個通道變量 fix_extrtpip ,設為 true時,呼叫發起是則強制SDP的位址為 external_rtp_ip配置的值。

源碼中增加該變量的控制

freeswitch 1.10.1 版本 switch_core_media.c -> switch_core_media_choose_port 函數。

增加的代碼是紅色部分:

if(switch_channel_var_true(session->channel, "fix_extrtpip")){

            use_ip = smh->mparams->extrtpip;

  }else{

            use_ip = smh->mparams->rtpip;

   }

在源碼中的大緻位置 8214 行:

/* Check if NAT is detected  */
	if (!zstr(smh->mparams->remote_ip) && switch_core_media_check_nat(smh, smh->mparams->remote_ip)) {
		/* Yes, map the port through switch_nat */
		switch_nat_add_mapping(engine->local_sdp_port, SWITCH_NAT_UDP, &sdp_port, SWITCH_FALSE);

		switch_snprintf(vname, sizeof(vname), "rtp_adv_%s_ip", tstr);

		/* Find an IP address to use */
		if (!(use_ip = switch_channel_get_variable(session->channel, vname))
			&& !zstr(smh->mparams->extrtpip)) {
			use_ip = smh->mparams->extrtpip;
		}

		if (use_ip) {
			if (switch_core_media_ext_address_lookup(session, &lookup_rtpip, &sdp_port, use_ip) != SWITCH_STATUS_SUCCESS) {
				/* Address lookup was required and fail (external ip was "host:..." or "stun:...") */
				return SWITCH_STATUS_FALSE;
			} else {
				/* Address properly resolved, use it as external ip */
				use_ip = lookup_rtpip;
			}
		} else {
			/* No external ip found, use the profile's rtp ip */
			use_ip = smh->mparams->rtpip;
		}
	} else {

	+	//add by aominle [20211021] : 強制sdp為公網IP
	+	if(switch_channel_var_true(session->channel, "fix_extrtpip")){
			use_ip = smh->mparams->extrtpip;
	+	}else{
			/* No NAT traversal required, use the profile's rtp ip */
			use_ip = smh->mparams->rtpip;
		}
	}
           

用法:

在發起呼叫是增加通道變量 {fix_extrtpip=true}

繼續閱讀