diff --git a/libs/sofia-sip/RELEASE b/libs/sofia-sip/RELEASE index f514c261d8..611367c1e3 100644 --- a/libs/sofia-sip/RELEASE +++ b/libs/sofia-sip/RELEASE @@ -5,31 +5,26 @@ Release notes for current version of Sofia-SIP Changes since last release -------------------------- -Beside bugfixes, a server graylisting was added to nta and a few -improvements in event handling were made in nua interface. + -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 ------------------------------ -New features in API are marked with Doxytag macro @NEW_1_12_8 or -@VERSION_1_12_8. + + +**template**: New features in API are marked with Doxytag macro @VERSION_1_XX_X. libsofia-sip-ua: -- Added nta_sip_is_internal(), nta_msg_is_internal() function in - . 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 -- Added su_home_lock(), su_home_trylock(), and su_home_unlock() in - -- Added type-neutral template macros for hash tables HTABLE2_DECLARE2(), HTABLE2_PROTOS2(), - and HTABLE2_BODIES2(). -- Added sres_cache_set_srv_priority() in and - sres_set_cached_srv_priority() for graylisting - SRV records for inresponsive servers. -- nua_create()/nta_agent_create()/tport_bind() now joins to multicast group - if "maddr" parameter is specified +- **template**: Added foobar() function (sofia-sip/foobar.h). - This release is ABI/API compatible with applications linked against 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 @@ -43,74 +38,32 @@ libsofia-sip-ua-glib: Contributors to this release ---------------------------- -- Bernhard Suttner contributed patch to soa for using a=inactive attribute - with call hold -- Stefan Leuenberger from Netmodule contributed the hack for changing - priority of SRV records if a SIP server was inresponsive -- Daniele Rondina contributed patches fixing crash in STUN discovery cleanup - and for transport handling with nta_outgoing_*create() -- Youness Alaoui sent a iPhone build fix -- Michael Jerris and Stefan Knoblich from Freeswitch project reported - numerous bugs and contributed fixes - + + +- **template**: First Surname (patch to nua/soa/msg) + See the AUTHORS file in the distribution package. Notes on new features --------------------- -SIP Server Graylisting ----------------------- - -The hack contributed by Stefan Leuenberger from Netmodule changes the -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 -------------------------- -* 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 - check the sf.net bug tracker; see closed bugs, sorted by closing date diff --git a/libs/sofia-sip/configure.ac b/libs/sofia-sip/configure.ac index 46ae8e6621..7a9a603f76 100644 --- a/libs/sofia-sip/configure.ac +++ b/libs/sofia-sip/configure.ac @@ -11,7 +11,7 @@ dnl information on the package dnl --------------------------- 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_SUBST(VER_LIBSOFIA_SIP_UA_MAJOR_MINOR, [1.12]) dnl Includedir specific to this sofia version diff --git a/libs/sofia-sip/libsofia-sip-ua/nta/nta.c b/libs/sofia-sip/libsofia-sip-ua/nta/nta.c index 3107ca88b6..9af20568e3 100644 --- a/libs/sofia-sip/libsofia-sip-ua/nta/nta.c +++ b/libs/sofia-sip/libsofia-sip-ua/nta/nta.c @@ -8846,12 +8846,14 @@ struct sipdns_query uint16_t sq_type; /* query type */ uint16_t sq_priority; /* priority or preference */ 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_resolving(nta_outgoing_t *orq); static int outgoing_resolving_error(nta_outgoing_t *, 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 void outgoing_answer_naptr(sres_context_t *orq, sres_query_t *q, sres_record_t *answers[]); @@ -9092,50 +9094,61 @@ outgoing_try_another(nta_outgoing_t *orq) /* find latest A/AAAA record */ sq = sr->sr_head; - if (!sq || (sr->sr_a_aaaa1 != sr->sr_a_aaaa2 && sq->sq_type == sr->sr_a_aaaa1)) - sq = sr->sr_done; - - if (sq && sq->sq_otype == sres_type_srv) { - char const *target = sq->sq_domain, *proto = sq->sq_proto; - 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)); - } + if (sq && sq->sq_type == sr->sr_a_aaaa2 && sr->sr_a_aaaa1 != sr->sr_a_aaaa2) { + sq->sq_grayish = 1; + } + else { + outgoing_graylist(orq, sr->sr_done); } } 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 */ su_inline void outgoing_cancel_resolver(nta_outgoing_t *orq) { @@ -9765,6 +9778,9 @@ outgoing_query_results(nta_outgoing_t *orq, } else { sq->sq_next = sr->sr_done, sr->sr_done = sq; + + if (rlen == 0 && sq->sq_grayish) + outgoing_graylist(orq, sq); } if (rlen > 1) diff --git a/libs/sofia-sip/libsofia-sip-ua/nta/test_nta.c b/libs/sofia-sip/libsofia-sip-ua/nta/test_nta.c index 0cc7fe4d8a..4ee13d7f6d 100644 --- a/libs/sofia-sip/libsofia-sip-ua/nta/test_nta.c +++ b/libs/sofia-sip/libsofia-sip-ua/nta/test_nta.c @@ -2256,11 +2256,15 @@ int test_dialog(agent_t *ag) END(); } +#ifndef MSG_TRUNC +#define MSG_TRUNC 0 +#endif + static ssize_t recv_udp(agent_t *ag, void *b, size_t size) { ssize_t n; - memset(b, size, 0); + memset(b, 0, size); for (;;) { 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; socklen_t sulen = ag->ag_su_nta_len; -#ifndef MSG_TRUNC -#define MSG_TRUNC 0 -#endif - /* Empty sink socket */ su_setblocking(ag->ag_sink_socket, 0); while (su_recv(ag->ag_sink_socket, m1, sizeof m1, MSG_TRUNC) >= 0)