sync to darcs tree
Thu Jan 17 07:57:29 EST 2008 Pekka.Pessi@nokia.com * configure.ac: prerelease version Wed Jan 23 13:22:39 EST 2008 Pekka.Pessi@nokia.com * test_nta.c: fixed memset() usage. MSG_TRUNC. Wed Jan 23 13:25:42 EST 2008 Pekka Pessi <Pekka.Pessi@nokia.com> * RELEASE, configure.ac: release 1.12.8 Wed Jan 23 13:25:46 EST 2008 Pekka Pessi <Pekka.Pessi@nokia.com> tagged rel-sofia-sip_1_12_8 Wed Jan 23 13:25:52 EST 2008 Pekka Pessi <Pekka.Pessi@nokia.com> tagged 1.12.8 Wed Jan 23 14:25:07 EST 2008 Pekka.Pessi@nokia.com * RELEASE, configure.ac: 1.12.8devel Fri Jan 25 04:31:39 EST 2008 Pekka.Pessi@nokia.com * nta.c: fixed graylisting if used with IPv4/IPv6 only git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@7372 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
parent
c9d1827232
commit
aa1b4bb463
|
@ -5,31 +5,26 @@ Release notes for current version of Sofia-SIP
|
||||||
Changes since last release
|
Changes since last release
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
||||||
Beside bugfixes, a server graylisting was added to nta and a few
|
<changes since last written in freshmeat.net "Changes:" style;
|
||||||
improvements in event handling were made in nua interface.
|
and in less than 10 lines, written in 3rd person English, with
|
||||||
|
complete sentences />
|
||||||
|
|
||||||
A check-based test program was added, too.
|
Bugs in blaa and foo have been fixed. The stack now supports
|
||||||
|
use of foobar...
|
||||||
|
|
||||||
API/ABI changes and versioning
|
API/ABI changes and versioning
|
||||||
------------------------------
|
------------------------------
|
||||||
|
|
||||||
New features in API are marked with Doxytag macro @NEW_1_12_8 or
|
<see previous release notes at
|
||||||
@VERSION_1_12_8.
|
http://sofia-sip.sourceforge.net/relnotes/ for examples ;
|
||||||
|
- should include all changes to public headers, and
|
||||||
|
other important information to developers;
|
||||||
|
- and should be updated _continuously_! />
|
||||||
|
|
||||||
|
**template**: New features in API are marked with Doxytag macro @VERSION_1_XX_X.
|
||||||
|
|
||||||
libsofia-sip-ua:
|
libsofia-sip-ua:
|
||||||
- Added nta_sip_is_internal(), nta_msg_is_internal() function in
|
- **template**: Added foobar() function (sofia-sip/foobar.h).
|
||||||
<sofia-sip/nta.h>. Deprecating nta_is_internal_msg().
|
|
||||||
- Added su_msg_new(), su_msg_send_to() and su_msg_deinitializer() for more
|
|
||||||
robust and light-weight message passing in <sofia-sip/su_wait.h>
|
|
||||||
- Added su_home_lock(), su_home_trylock(), and su_home_unlock() in
|
|
||||||
<sofia-sip/su_alloc.h>
|
|
||||||
- Added type-neutral template macros for hash tables HTABLE2_DECLARE2(), HTABLE2_PROTOS2(),
|
|
||||||
and HTABLE2_BODIES2().
|
|
||||||
- Added sres_cache_set_srv_priority() in <sofia-resolv/sres_cache.h> and
|
|
||||||
sres_set_cached_srv_priority() <sofia-resolv/sres.h> for graylisting
|
|
||||||
SRV records for inresponsive servers.
|
|
||||||
- nua_create()/nta_agent_create()/tport_bind() now joins to multicast group
|
|
||||||
if "maddr" parameter is specified
|
|
||||||
- This release is ABI/API compatible with applications linked against
|
- This release is ABI/API compatible with applications linked against
|
||||||
any 1.12.x release. However, applications built against this release won't
|
any 1.12.x release. However, applications built against this release won't
|
||||||
work against an older library. The ABI has been tested with the nua module
|
work against an older library. The ABI has been tested with the nua module
|
||||||
|
@ -43,74 +38,32 @@ libsofia-sip-ua-glib:
|
||||||
Contributors to this release
|
Contributors to this release
|
||||||
----------------------------
|
----------------------------
|
||||||
|
|
||||||
- Bernhard Suttner contributed patch to soa for using a=inactive attribute
|
<list of people who contributed to _this_ release
|
||||||
with call hold
|
- update as people's patches are added, or when you commit stuff
|
||||||
- Stefan Leuenberger from Netmodule contributed the hack for changing
|
- current development team members (see AUTHORS) may be omitted,
|
||||||
priority of SRV records if a SIP server was inresponsive
|
or listed at the end of the contribur list (depending on the scope
|
||||||
- Daniele Rondina contributed patches fixing crash in STUN discovery cleanup
|
of the work done since the last release)
|
||||||
and for transport handling with nta_outgoing_*create()
|
- name of the contributor should be enough (email addresses in AUTHORS),
|
||||||
- Youness Alaoui sent a iPhone build fix
|
plus a _brief_ description of what was contributed
|
||||||
- Michael Jerris and Stefan Knoblich from Freeswitch project reported
|
- roughly sorted by number of patches accepted
|
||||||
numerous bugs and contributed fixes
|
/>
|
||||||
|
|
||||||
|
- **template**: First Surname (patch to nua/soa/msg)
|
||||||
|
|
||||||
See the AUTHORS file in the distribution package.
|
See the AUTHORS file in the distribution package.
|
||||||
|
|
||||||
Notes on new features
|
Notes on new features
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
SIP Server Graylisting
|
<information about major new features
|
||||||
----------------------
|
- new/changed/removed functionality
|
||||||
|
- links to further documentation
|
||||||
The hack contributed by Stefan Leuenberger from Netmodule changes the
|
- section may be omitted for minor releases
|
||||||
priority of SRV records which are used when SIP URI is resolved.
|
/>
|
||||||
|
|
||||||
If your domain has multiple servers, you can define separate SRV records for
|
|
||||||
them. If any of them becomes unresponsive, a SIP request sent to it times
|
|
||||||
out or gets rejected because of network error and Sofia SIP automatically
|
|
||||||
retries with another server. However, as Sofia SIP does not keep track of
|
|
||||||
failed servers with the next request it may again try first the failed
|
|
||||||
server. The graylisting repriotizes the SRV records so that the priority of
|
|
||||||
the failed server gets reduced and it won't be tried again until all other
|
|
||||||
servers have failed, too. Note that the SIP URI resolver may get confused
|
|
||||||
when using this kind of repriotizing if a single SRV record corresponds to
|
|
||||||
multiple servers or servers with multiple addresses.
|
|
||||||
|
|
||||||
You can disable the reprioritizing hack by including tag NTATAG_GREYLIST(0)
|
|
||||||
with nua_create(), nua_set_params(), nta_agent_create() or
|
|
||||||
nta_agent_set_params().
|
|
||||||
|
|
||||||
Bugs fixed in this release
|
Bugs fixed in this release
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
||||||
* Fixed su_home_init not initializing suh_lock.
|
|
||||||
* Fixed memory leak when increasing hash table size
|
|
||||||
* Fixed problems with multiple authentication challenges.
|
|
||||||
* Fixed sf.net bug #1816647: Outbound contact does not make it to dialogs.
|
|
||||||
* Fixed problem with tagargs, amd64 and Sun CC.
|
|
||||||
* Fixed nta_outgoing_*create() not using NTATAG_TPORT() if
|
|
||||||
NTATAG_DEFAULT_PROXY() was set.
|
|
||||||
* Fixed memory leak from nua operations.
|
|
||||||
* Fixed crash when INVITE destroyed session before UPDATE or PRACK completed
|
|
||||||
* Fixed crash in stun when destroying stun context during discovery callback
|
|
||||||
* Fixed nta timer interval calculation ignoring some transactions
|
|
||||||
* Fixed request merging when client is RFC 2543 proxy
|
|
||||||
* Fixed request matching and merging if To/From URI does not match
|
|
||||||
* Fixed problem with soa and overlapping INVITEs
|
|
||||||
* Fixed handling of RFC 2848 subscriptions (without Event header)
|
|
||||||
* Fixed problems with expiration time calculations if NOTIFY is sent before
|
|
||||||
SUBSCRIBE has been responded
|
|
||||||
* Fixed su_getaddrinfo() with ephemeral (NULL or "0") service
|
|
||||||
* Fixed IPv6 build with Vista SDK
|
|
||||||
* Fixed sf.net bug #1867753 (avoid duplicating initial route set
|
|
||||||
* Fixed SCTP receive
|
|
||||||
* Using tport_log and su_llog() when logging TLS warnings and errors
|
|
||||||
* Removed asserts on hairy dialog shutdown cases.
|
|
||||||
* Using remote activity mode derived from O/A result rather than mode based on remote
|
|
||||||
offer
|
|
||||||
* Fixed mode in SDP offer while on hold
|
|
||||||
* Fixed handling of REFER in nua when it gets redirected or challenged
|
|
||||||
* Fixed memory corruption when sending of ACK request failed.
|
|
||||||
|
|
||||||
< notable bugs fixed in this release
|
< notable bugs fixed in this release
|
||||||
- check the sf.net bug tracker; see closed bugs,
|
- check the sf.net bug tracker; see closed bugs,
|
||||||
sorted by closing date
|
sorted by closing date
|
||||||
|
|
|
@ -11,7 +11,7 @@ dnl information on the package
|
||||||
dnl ---------------------------
|
dnl ---------------------------
|
||||||
|
|
||||||
dnl update both the version for AC_INIT and the LIBSOFIA_SIP_UA_MAJOR_MINOR
|
dnl update both the version for AC_INIT and the LIBSOFIA_SIP_UA_MAJOR_MINOR
|
||||||
AC_INIT([sofia-sip], [1.12.7devel])
|
AC_INIT([sofia-sip], [1.12.8devel])
|
||||||
AC_CONFIG_SRCDIR([libsofia-sip-ua/sip/sofia-sip/sip.h])
|
AC_CONFIG_SRCDIR([libsofia-sip-ua/sip/sofia-sip/sip.h])
|
||||||
AC_SUBST(VER_LIBSOFIA_SIP_UA_MAJOR_MINOR, [1.12])
|
AC_SUBST(VER_LIBSOFIA_SIP_UA_MAJOR_MINOR, [1.12])
|
||||||
dnl Includedir specific to this sofia version
|
dnl Includedir specific to this sofia version
|
||||||
|
|
|
@ -8846,12 +8846,14 @@ struct sipdns_query
|
||||||
uint16_t sq_type; /* query type */
|
uint16_t sq_type; /* query type */
|
||||||
uint16_t sq_priority; /* priority or preference */
|
uint16_t sq_priority; /* priority or preference */
|
||||||
uint16_t sq_weight; /* preference or weight */
|
uint16_t sq_weight; /* preference or weight */
|
||||||
|
uint16_t sq_grayish; /* candidate for graylisting */
|
||||||
};
|
};
|
||||||
|
|
||||||
static int outgoing_resolve_next(nta_outgoing_t *orq);
|
static int outgoing_resolve_next(nta_outgoing_t *orq);
|
||||||
static int outgoing_resolving(nta_outgoing_t *orq);
|
static int outgoing_resolving(nta_outgoing_t *orq);
|
||||||
static int outgoing_resolving_error(nta_outgoing_t *,
|
static int outgoing_resolving_error(nta_outgoing_t *,
|
||||||
int status, char const *phrase);
|
int status, char const *phrase);
|
||||||
|
static void outgoing_graylist(nta_outgoing_t *orq, struct sipdns_query *sq);
|
||||||
static int outgoing_query_naptr(nta_outgoing_t *orq, char const *domain);
|
static int outgoing_query_naptr(nta_outgoing_t *orq, char const *domain);
|
||||||
static void outgoing_answer_naptr(sres_context_t *orq, sres_query_t *q,
|
static void outgoing_answer_naptr(sres_context_t *orq, sres_query_t *q,
|
||||||
sres_record_t *answers[]);
|
sres_record_t *answers[]);
|
||||||
|
@ -9092,50 +9094,61 @@ outgoing_try_another(nta_outgoing_t *orq)
|
||||||
|
|
||||||
/* find latest A/AAAA record */
|
/* find latest A/AAAA record */
|
||||||
sq = sr->sr_head;
|
sq = sr->sr_head;
|
||||||
if (!sq || (sr->sr_a_aaaa1 != sr->sr_a_aaaa2 && sq->sq_type == sr->sr_a_aaaa1))
|
if (sq && sq->sq_type == sr->sr_a_aaaa2 && sr->sr_a_aaaa1 != sr->sr_a_aaaa2) {
|
||||||
sq = sr->sr_done;
|
sq->sq_grayish = 1;
|
||||||
|
}
|
||||||
if (sq && sq->sq_otype == sres_type_srv) {
|
else {
|
||||||
char const *target = sq->sq_domain, *proto = sq->sq_proto;
|
outgoing_graylist(orq, sr->sr_done);
|
||||||
unsigned prio = sq->sq_priority, maxprio = prio;
|
|
||||||
|
|
||||||
SU_DEBUG_5(("nta: no response from %s:%s;transport=%s\n", target, sq->sq_port, proto));
|
|
||||||
|
|
||||||
for (sq = sr->sr_head; sq; sq = sq->sq_next)
|
|
||||||
if (sq->sq_otype == sres_type_srv && sq->sq_priority > maxprio)
|
|
||||||
maxprio = sq->sq_priority;
|
|
||||||
|
|
||||||
for (sq = sr->sr_done; sq; sq = sq->sq_next)
|
|
||||||
if (sq->sq_otype == sres_type_srv && sq->sq_priority > maxprio)
|
|
||||||
maxprio = sq->sq_priority;
|
|
||||||
|
|
||||||
for (sq = sr->sr_done; sq; sq = sq->sq_next) {
|
|
||||||
int modified;
|
|
||||||
|
|
||||||
if (sq->sq_type != sres_type_srv || strcmp(proto, sq->sq_proto))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* modify the SRV record(s) corresponding to the latest A/AAAA record */
|
|
||||||
modified = sres_set_cached_srv_priority(
|
|
||||||
orq->orq_agent->sa_resolver,
|
|
||||||
sq->sq_domain,
|
|
||||||
target,
|
|
||||||
sq->sq_port[0] ? (uint16_t)strtoul(sq->sq_port, NULL, 10) : 0,
|
|
||||||
orq->orq_agent->sa_graylist,
|
|
||||||
maxprio + 1);
|
|
||||||
|
|
||||||
if (modified >= 0)
|
|
||||||
SU_DEBUG_3(("nta: reduced priority of %d %s SRV records (increase value to %u)\n",
|
|
||||||
modified, sq->sq_domain, maxprio + 1));
|
|
||||||
else
|
|
||||||
SU_DEBUG_3(("nta: failed to reduce %s SRV priority\n", sq->sq_domain));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return outgoing_resolve_next(orq);
|
return outgoing_resolve_next(orq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Graylist SRV records */
|
||||||
|
static void outgoing_graylist(nta_outgoing_t *orq, struct sipdns_query *sq)
|
||||||
|
{
|
||||||
|
struct sipdns_resolver *sr = orq->orq_resolver;
|
||||||
|
char const *target = sq->sq_domain, *proto = sq->sq_proto;
|
||||||
|
unsigned prio = sq->sq_priority, maxprio = prio;
|
||||||
|
|
||||||
|
/* Don't know how to graylist but SRV records */
|
||||||
|
if (sq->sq_otype != sres_type_srv)
|
||||||
|
return;
|
||||||
|
|
||||||
|
SU_DEBUG_5(("nta: graylisting %s:%s;transport=%s\n", target, sq->sq_port, proto));
|
||||||
|
|
||||||
|
for (sq = sr->sr_head; sq; sq = sq->sq_next)
|
||||||
|
if (sq->sq_otype == sres_type_srv && sq->sq_priority > maxprio)
|
||||||
|
maxprio = sq->sq_priority;
|
||||||
|
|
||||||
|
for (sq = sr->sr_done; sq; sq = sq->sq_next)
|
||||||
|
if (sq->sq_otype == sres_type_srv && sq->sq_priority > maxprio)
|
||||||
|
maxprio = sq->sq_priority;
|
||||||
|
|
||||||
|
for (sq = sr->sr_done; sq; sq = sq->sq_next) {
|
||||||
|
int modified;
|
||||||
|
|
||||||
|
if (sq->sq_type != sres_type_srv || strcmp(proto, sq->sq_proto))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* modify the SRV record(s) corresponding to the latest A/AAAA record */
|
||||||
|
modified = sres_set_cached_srv_priority(
|
||||||
|
orq->orq_agent->sa_resolver,
|
||||||
|
sq->sq_domain,
|
||||||
|
target,
|
||||||
|
sq->sq_port[0] ? (uint16_t)strtoul(sq->sq_port, NULL, 10) : 0,
|
||||||
|
orq->orq_agent->sa_graylist,
|
||||||
|
maxprio + 1);
|
||||||
|
|
||||||
|
if (modified >= 0)
|
||||||
|
SU_DEBUG_3(("nta: reduced priority of %d %s SRV records (increase value to %u)\n",
|
||||||
|
modified, sq->sq_domain, maxprio + 1));
|
||||||
|
else
|
||||||
|
SU_DEBUG_3(("nta: failed to reduce %s SRV priority\n", sq->sq_domain));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** Cancel resolver query */
|
/** Cancel resolver query */
|
||||||
su_inline void outgoing_cancel_resolver(nta_outgoing_t *orq)
|
su_inline void outgoing_cancel_resolver(nta_outgoing_t *orq)
|
||||||
{
|
{
|
||||||
|
@ -9765,6 +9778,9 @@ outgoing_query_results(nta_outgoing_t *orq,
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
sq->sq_next = sr->sr_done, sr->sr_done = sq;
|
sq->sq_next = sr->sr_done, sr->sr_done = sq;
|
||||||
|
|
||||||
|
if (rlen == 0 && sq->sq_grayish)
|
||||||
|
outgoing_graylist(orq, sq);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rlen > 1)
|
if (rlen > 1)
|
||||||
|
|
|
@ -2256,11 +2256,15 @@ int test_dialog(agent_t *ag)
|
||||||
END();
|
END();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef MSG_TRUNC
|
||||||
|
#define MSG_TRUNC 0
|
||||||
|
#endif
|
||||||
|
|
||||||
static ssize_t recv_udp(agent_t *ag, void *b, size_t size)
|
static ssize_t recv_udp(agent_t *ag, void *b, size_t size)
|
||||||
{
|
{
|
||||||
ssize_t n;
|
ssize_t n;
|
||||||
|
|
||||||
memset(b, size, 0);
|
memset(b, 0, size);
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
su_root_step(ag->ag_root, 10L);
|
su_root_step(ag->ag_root, 10L);
|
||||||
|
@ -2305,10 +2309,6 @@ int test_merging(agent_t *ag)
|
||||||
su_sockaddr_t *su = ag->ag_su_nta;
|
su_sockaddr_t *su = ag->ag_su_nta;
|
||||||
socklen_t sulen = ag->ag_su_nta_len;
|
socklen_t sulen = ag->ag_su_nta_len;
|
||||||
|
|
||||||
#ifndef MSG_TRUNC
|
|
||||||
#define MSG_TRUNC 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Empty sink socket */
|
/* Empty sink socket */
|
||||||
su_setblocking(ag->ag_sink_socket, 0);
|
su_setblocking(ag->ag_sink_socket, 0);
|
||||||
while (su_recv(ag->ag_sink_socket, m1, sizeof m1, MSG_TRUNC) >= 0)
|
while (su_recv(ag->ag_sink_socket, m1, sizeof m1, MSG_TRUNC) >= 0)
|
||||||
|
|
Loading…
Reference in New Issue