提交 b8f52353 authored 作者: Michael Jerris's avatar Michael Jerris

Thu Feb 12 15:14:07 CST 2009 Pekka Pessi <first.last@nokia.com>

  * soa: make better effort in keeping addresses (c= and o= lines) in user SDP
  Ignore-this: a6da9ed249dba3309e3dbbbdb4262082
  
  The address selection logic now prefers (unicast) addresses in already
  present in SDP, if they get returned by su_getlocalinfo(). 
  
  The process currently tries to avoid link-local addresses.



git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@11962 d0543943-73ff-0310-b7d9-9358b9ac24b2
上级 2f0b4f5f
Thu Feb 12 15:25:06 CST 2009 Thu Feb 12 15:28:20 CST 2009
...@@ -14,7 +14,8 @@ INCLUDES = -I$(srcdir)/../sdp -I../sdp \ ...@@ -14,7 +14,8 @@ INCLUDES = -I$(srcdir)/../sdp -I../sdp \
-I$(srcdir)/../url -I../url \ -I$(srcdir)/../url -I../url \
-I$(srcdir)/../ipt -I../ipt \ -I$(srcdir)/../ipt -I../ipt \
-I$(srcdir)/../bnf -I../bnf \ -I$(srcdir)/../bnf -I../bnf \
-I$(srcdir)/../su -I../su -I$(srcdir)/../su -I../su \
-I$(top_srcdir)/s2check
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
# Build targets # Build targets
...@@ -39,7 +40,8 @@ libsoa_la_SOURCES = soa.c soa_static.c \ ...@@ -39,7 +40,8 @@ libsoa_la_SOURCES = soa.c soa_static.c \
COVERAGE_INPUT = $(libsoa_la_SOURCES) $(include_sofia_HEADERS) COVERAGE_INPUT = $(libsoa_la_SOURCES) $(include_sofia_HEADERS)
LDADD = libsoa.la \ test_soa_LDADD = $(top_builddir)/s2check/libs2.a \
libsoa.la \
../sip/libsip.la \ ../sip/libsip.la \
../msg/libmsg.la \ ../msg/libmsg.la \
../url/liburl.la \ ../url/liburl.la \
......
...@@ -1092,7 +1092,6 @@ static int offer_answer_step(soa_session_t *ss, ...@@ -1092,7 +1092,6 @@ static int offer_answer_step(soa_session_t *ss,
{ {
soa_static_session_t *sss = (soa_static_session_t *)ss; soa_static_session_t *sss = (soa_static_session_t *)ss;
char c_address[64];
sdp_session_t *local = ss->ss_local->ssd_sdp; sdp_session_t *local = ss->ss_local->ssd_sdp;
sdp_session_t local0[1]; sdp_session_t local0[1];
...@@ -1102,8 +1101,12 @@ static int offer_answer_step(soa_session_t *ss, ...@@ -1102,8 +1101,12 @@ static int offer_answer_step(soa_session_t *ss,
sdp_session_t *remote = ss->ss_remote->ssd_sdp; sdp_session_t *remote = ss->ss_remote->ssd_sdp;
unsigned remote_version = ss->ss_remote_version; unsigned remote_version = ss->ss_remote_version;
int fresh = 0;
sdp_origin_t o[1] = {{ sizeof(o) }}; sdp_origin_t o[1] = {{ sizeof(o) }};
sdp_connection_t *c, c0[1] = {{ sizeof(c0) }}; sdp_connection_t *c, c0[1] = {{ sizeof(c0) }};
char c0_buffer[64];
sdp_time_t t[1] = {{ sizeof(t) }}; sdp_time_t t[1] = {{ sizeof(t) }};
int *u2s = NULL, *s2u = NULL, *tbf; int *u2s = NULL, *s2u = NULL, *tbf;
...@@ -1150,22 +1153,16 @@ static int offer_answer_step(soa_session_t *ss, ...@@ -1150,22 +1153,16 @@ static int offer_answer_step(soa_session_t *ss,
SU_DEBUG_7(("soa_static(%p, %s): %s\n", (void *)ss, by, SU_DEBUG_7(("soa_static(%p, %s): %s\n", (void *)ss, by,
"generating local description")); "generating local description"));
fresh = 1;
local = local0; local = local0;
*local = *user, local->sdp_media = NULL; *local = *user, local->sdp_media = NULL;
if (local->sdp_origin) { o->o_username = "-";
o->o_username = local->sdp_origin->o_username;
/* o->o_address = local->sdp_origin->o_address; */
}
if (!o->o_address)
o->o_address = c0; o->o_address = c0;
local->sdp_origin = o; c0->c_address = c0_buffer;
if (soa_init_sdp_origin(ss, o, c_address) < 0) {
phrase = "Cannot Get IP Address for Media";
goto internal_error;
}
if (!local->sdp_origin)
local->sdp_origin = o;
break; break;
case process_answer: case process_answer:
...@@ -1283,28 +1280,46 @@ static int offer_answer_step(soa_session_t *ss, ...@@ -1283,28 +1280,46 @@ static int offer_answer_step(soa_session_t *ss,
break; break;
} }
/* Step F: Update c= line */ /* Step F0: Initialize o= line */
if (fresh) {
if (user->sdp_origin)
o->o_username = user->sdp_origin->o_username;
if (soa_init_sdp_origin_with_session(ss, o, c0_buffer, local) < 0) {
phrase = "Cannot Get IP Address for Session Description";
goto internal_error;
}
local->sdp_origin = o;
}
/* Step F: Update c= line(s) */
switch (action) { switch (action) {
sdp_connection_t *user_c, *local_c;
case generate_offer: case generate_offer:
case generate_answer: case generate_answer:
/* Upgrade local SDP based of user SDP */ user_c = user->sdp_connection;
if (ss->ss_local_user_version == user_version && if (!soa_check_sdp_connection(user_c))
local->sdp_connection) user_c = NULL;
break;
local_c = local->sdp_connection;
if (!soa_check_sdp_connection(local_c))
local_c = NULL;
if (local->sdp_connection == NULL || if (ss->ss_local_user_version != user_version ||
(user->sdp_connection != NULL && local_c == NULL ||
sdp_connection_cmp(local->sdp_connection, user->sdp_connection))) { (user_c != NULL && sdp_connection_cmp(local_c, user_c))) {
sdp_media_t *m; sdp_media_t *m;
/* Every m= line (even rejected one) must have a c= line if (user_c)
* or there must be a c= line at session level c = user_c;
*/
if (user->sdp_connection)
c = user->sdp_connection;
else else
c = local->sdp_origin->o_address; c = local->sdp_origin->o_address;
/* Every m= line (even rejected one) must have a c= line
* or there must be a c= line at session level
*/
for (m = local->sdp_media; m; m = m->m_next) for (m = local->sdp_media; m; m = m->m_next)
if (m->m_connections == NULL) if (m->m_connections == NULL)
break; break;
......
...@@ -238,7 +238,11 @@ SOFIAPUBFUN int soa_has_received_sdp(soa_session_t const *ss); ...@@ -238,7 +238,11 @@ SOFIAPUBFUN int soa_has_received_sdp(soa_session_t const *ss);
SOFIAPUBFUN int soa_set_status(soa_session_t *ss, SOFIAPUBFUN int soa_set_status(soa_session_t *ss,
int status, char const *phrase); int status, char const *phrase);
enum soa_activity { soa_activity_local, soa_activity_remote, soa_activity_session }; enum soa_activity {
soa_activity_local,
soa_activity_remote,
soa_activity_session
};
SOFIAPUBFUN void soa_set_activity(soa_session_t *ss, SOFIAPUBFUN void soa_set_activity(soa_session_t *ss,
sdp_media_t const *m, sdp_media_t const *m,
...@@ -259,8 +263,18 @@ SOFIAPUBFUN int soa_description_dup(su_home_t *, ...@@ -259,8 +263,18 @@ SOFIAPUBFUN int soa_description_dup(su_home_t *,
SOFIAPUBFUN int soa_init_sdp_origin(soa_session_t *ss, SOFIAPUBFUN int soa_init_sdp_origin(soa_session_t *ss,
sdp_origin_t *o, char buf[64]); sdp_origin_t *o, char buf[64]);
SOFIAPUBFUN int soa_init_sdp_origin_with_session(soa_session_t *ss,
sdp_origin_t *o,
char buffer[64],
sdp_session_t const *sdp);
SOFIAPUBFUN int soa_check_sdp_connection(sdp_connection_t const *c);
SOFIAPUBFUN int soa_init_sdp_connection(soa_session_t *, SOFIAPUBFUN int soa_init_sdp_connection(soa_session_t *,
sdp_connection_t *, char buf[64]); sdp_connection_t *, char buf[64]);
SOFIAPUBFUN int soa_init_sdp_connection_with_session(soa_session_t *,
sdp_connection_t *, char buf[64],
sdp_session_t const *sdp);
SOFIAPUBFUN sdp_connection_t *soa_find_local_sdp_connection(sdp_session_t const*);
/* ====================================================================== */ /* ====================================================================== */
/* Debug log settings */ /* Debug log settings */
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论