]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
Thu Aug 7 07:53:01 EDT 2008 Pekka Pessi <first.last@nokia.com>
authorMichael Jerris <mike@jerris.com>
Tue, 12 Aug 2008 17:06:57 +0000 (17:06 +0000)
committerMichael Jerris <mike@jerris.com>
Tue, 12 Aug 2008 17:06:57 +0000 (17:06 +0000)
  * soa_static.c: increment version number in o= line only when generating offer or answer

  Bug reported by Timo Bruhn.

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@9276 d0543943-73ff-0310-b7d9-9358b9ac24b2

libs/sofia-sip/.update
libs/sofia-sip/libsofia-sip-ua/soa/soa_static.c

index 89bf81e74281c28110238128a8d8e9f333c16b86..903b6b6c669355fedb16d040bf2bf1d84d27c1c8 100644 (file)
@@ -1 +1 @@
-Tue Aug 12 13:06:30 EDT 2008
+Tue Aug 12 13:06:53 EDT 2008
index b73cfd52fac87c3e4a66e155bd2cdbedfa944b1c..38ce8b2a1baa34f2b1cf63f5c10f53fbf47c8238 100644 (file)
@@ -87,6 +87,9 @@ typedef struct soa_static_session
   int  *sss_u2s;
   /** Mapping from session SDP m= lines to user SDP m= lines */
   int *sss_s2u;
+
+  /** Our latest offer or answer */
+  sdp_session_t *sss_latest;
 }
 soa_static_session_t;
 
@@ -1103,6 +1106,8 @@ static int offer_answer_step(soa_session_t *ss,
 
   int *u2s = NULL, *s2u = NULL, *tbf;
 
+  sdp_session_t *latest = NULL, *previous = NULL;
+
   char const *phrase = "Internal Media Error";
 
   su_home_t tmphome[SU_HOME_AUTO_SIZE(8192)];
@@ -1327,10 +1332,27 @@ static int offer_answer_step(soa_session_t *ss,
 
   if (ss->ss_local->ssd_sdp != local &&
       sdp_session_cmp(ss->ss_local->ssd_sdp, local)) {
-    /* We have modified local session: update origin-line */
-    if (local->sdp_origin != o)
-      *o = *local->sdp_origin, local->sdp_origin = o;
-    o->o_version++;
+    int bump;
+
+    switch (action) {
+    case generate_offer:
+      bump = sdp_session_cmp(local, sss->sss_latest);
+      break;
+    case generate_answer:
+      bump = 1;
+      break;
+    case process_answer:
+    default:
+      bump = 0;
+      break;
+    }
+
+    if (bump) {
+      /* Upgrade the version number */
+      if (local->sdp_origin != o)
+       *o = *local->sdp_origin, local->sdp_origin = o;
+      o->o_version++;
+    }
 
     /* Do sanity checks for the created SDP */
     if (!local->sdp_subject)   /* s= is mandatory */
@@ -1362,6 +1384,11 @@ static int offer_answer_step(soa_session_t *ss,
 
       goto internal_error;
     }
+
+    if (bump) {
+      latest = sdp_session_dup(ss->ss_home, ss->ss_local->ssd_sdp);
+      previous = sss->sss_latest;
+    }
   }
 
   if (u2s) {
@@ -1373,10 +1400,12 @@ static int offer_answer_step(soa_session_t *ss,
   switch (action) {
   case generate_offer:
     ss->ss_local_user_version = user_version;
+    sss->sss_latest = latest;
     break;
   case generate_answer:
     ss->ss_local_user_version = user_version;
     ss->ss_local_remote_version = remote_version;
+    sss->sss_latest = latest;
     break;
   case process_answer:
     ss->ss_local_remote_version = remote_version;
@@ -1384,6 +1413,9 @@ static int offer_answer_step(soa_session_t *ss,
     break;
   }
 
+  if (previous)
+    su_free(ss->ss_home, previous);
+
   su_home_deinit(tmphome);
   return 0;