From 8eaf59b7f3350077094f8c4bcd6fc0647907ee63 Mon Sep 17 00:00:00 2001 From: Michael Jerris Date: Tue, 12 Aug 2008 17:06:57 +0000 Subject: [PATCH] Thu Aug 7 07:53:01 EDT 2008 Pekka Pessi * 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 | 2 +- .../libsofia-sip-ua/soa/soa_static.c | 40 +++++++++++++++++-- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/libs/sofia-sip/.update b/libs/sofia-sip/.update index 89bf81e742..903b6b6c66 100644 --- a/libs/sofia-sip/.update +++ b/libs/sofia-sip/.update @@ -1 +1 @@ -Tue Aug 12 13:06:30 EDT 2008 +Tue Aug 12 13:06:53 EDT 2008 diff --git a/libs/sofia-sip/libsofia-sip-ua/soa/soa_static.c b/libs/sofia-sip/libsofia-sip-ua/soa/soa_static.c index b73cfd52fa..38ce8b2a1b 100644 --- a/libs/sofia-sip/libsofia-sip-ua/soa/soa_static.c +++ b/libs/sofia-sip/libsofia-sip-ua/soa/soa_static.c @@ -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;