]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
pass and decrement max_forwards across the bridge for sip
authorMichael Jerris <mike@jerris.com>
Tue, 6 Feb 2007 18:11:25 +0000 (18:11 +0000)
committerMichael Jerris <mike@jerris.com>
Tue, 6 Feb 2007 18:11:25 +0000 (18:11 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@4135 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/include/switch_types.h
src/mod/endpoints/mod_sofia/mod_sofia.c
src/switch_core.c

index 70c589875407532f2d6041dfd0a63d85a2a03cc7..b673f3b692f6cde79285b12914e29fb35d9fe452 100644 (file)
@@ -88,6 +88,7 @@ SWITCH_BEGIN_EXTERN_C
 #define SWITCH_REMOTE_MEDIA_IP_VARIABLE "remote_media_ip"
 #define SWITCH_REMOTE_MEDIA_PORT_VARIABLE "remote_media_port"
 #define SWITCH_HANGUP_AFTER_BRIDGE_VARIABLE "hangup_after_bridge"
+#define SWITCH_MAX_FORWARDS_VARIABLE "max_forwards"
 
 #define SWITCH_SPEECH_KEY "speech"
 #define SWITCH_UUID_BRIDGE "uuid_bridge"
index a388ccb09f8ab9e263eb8cee93cecff33d974cfb..e854a458b34ad9b2e853253c26325f98b6cf61ac 100644 (file)
@@ -952,7 +952,10 @@ static void do_invite(switch_core_session_t *session)
 {
        char rpid[1024] = { 0 };
        char alert_info[1024] = { 0 };
+       char max_forwards[8] = { 0 };
        char *alertbuf;
+       char *forwardbuf;
+       int forwardval;
        private_object_t *tech_pvt;
     switch_channel_t *channel = NULL;
        switch_caller_profile_t *caller_profile;
@@ -984,6 +987,11 @@ static void do_invite(switch_core_session_t *session)
                        snprintf(alert_info, sizeof(alert_info) - 1, "Alert-Info: %s", alertbuf);
                }
 
+               if ((forwardbuf = switch_channel_get_variable(channel, SWITCH_MAX_FORWARDS_VARIABLE))) {
+                       forwardval = atoi(forwardbuf) - 1;
+                       snprintf(max_forwards, sizeof(max_forwards) - 1, "%d", forwardval);
+               }
+
                if (tech_choose_port(tech_pvt) != SWITCH_STATUS_SUCCESS) {
             return;
         }
@@ -1046,9 +1054,11 @@ static void do_invite(switch_core_session_t *session)
                }
 
                holdstr = switch_test_flag(tech_pvt, TFLAG_SIP_HOLD) ? "*" : "";
+
                nua_invite(tech_pvt->nh,
                                   TAG_IF(!switch_strlen_zero(rpid), SIPTAG_HEADER_STR(rpid)),
-                                  TAG_IF(alert_info, SIPTAG_HEADER_STR(alert_info)),
+                                  TAG_IF(!switch_strlen_zero(alert_info), SIPTAG_HEADER_STR(alert_info)),
+                                  TAG_IF(!switch_strlen_zero(max_forwards),SIPTAG_MAX_FORWARDS_STR(max_forwards)),
                                   //SIPTAG_CONTACT_STR(tech_pvt->profile->url),
                                   SOATAG_USER_SDP_STR(tech_pvt->local_sdp_str),
                                   SOATAG_RTP_SORT(SOA_RTP_SORT_REMOTE),
@@ -4338,7 +4348,7 @@ static void sip_i_invite(nua_t *nua,
 
        if (sip->sip_max_forwards) {
                snprintf(uri, sizeof(uri), "%u", sip->sip_max_forwards->mf_count);
-               switch_channel_set_variable(channel, "max_forwards", uri);
+               switch_channel_set_variable(channel, SWITCH_MAX_FORWARDS_VARIABLE, uri);
        }
 
        if ((tech_pvt->caller_profile = switch_caller_profile_new(switch_core_session_get_pool(session),
index 717b31c020711e8e794215a794b9c3cee86ae31e..19e8b6debdfc028b7438110fb464a01c559030a0 100644 (file)
@@ -1660,6 +1660,10 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_outgoing_channel(switch_core
                        if ((val = switch_channel_get_variable(channel, SWITCH_R_SDP_VARIABLE))) {
                                switch_channel_set_variable(peer_channel, SWITCH_B_SDP_VARIABLE, val);
                        }
+
+                       if ((val = switch_channel_get_variable(channel, SWITCH_MAX_FORWARDS_VARIABLE))) {
+                               switch_channel_set_variable(peer_channel, SWITCH_MAX_FORWARDS_VARIABLE, val);
+                       }
                        
                        if (switch_channel_test_flag(channel, CF_NOMEDIA)) {
                                switch_channel_set_flag(peer_channel, CF_NOMEDIA);