[commit] r4767 - in freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua: iptsec msg nta nua nua/sofia-sip sip/tests su/sofia-sip tport url
Author: mikej Date: Mon Mar 26 14:05:55 2007 New Revision: 4767 Added: freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/sip/tests/10052.txt Modified: freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/iptsec/auth_client.c freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/msg/msg_parser_util.c freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nta/test_nta.c freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/Doxyfile freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/nua_dialog.h freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/nua_params.c freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/nua_params.h freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/nua_session.c freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/nua_stack.c freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/nua_tag.c freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/sofia-sip/nua_tag.h freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/test_100rel.c freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/test_call_reject.c freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/test_init.c freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/test_nua.c freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/test_nua.h freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/test_nua_params.c freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/test_register.c freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/su/sofia-sip/su_wait.h freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/tport/tport_type_udp.c freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/url/torture_url.c Log: upadte to sofia darcs Modified: freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/iptsec/auth_client.c ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/iptsec/auth_client.c (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/iptsec/auth_client.c Mon Mar 26 14:05:55 2007 @@ -178,9 +178,9 @@ return -1; if (!ca->ca_credential_class) - stale = 1, ca->ca_credential_class = credential_class; + stale = 2, ca->ca_credential_class = credential_class; - return stale ? 2 : 1; + return stale > 1 ? 2 : 1; } /** Store authentication info to authenticators. @@ -748,6 +748,10 @@ }; /** Store a digest authorization challenge. + * + * @retval 2 if credentials need to be (re)sent + * @retval 1 if challenge was updated + * @retval -1 upon an error */ static int auc_digest_challenge(auth_client_t *ca, msg_auth_t const *ch) { @@ -765,7 +769,7 @@ if (ac->ac_qop && !ac->ac_auth && !ac->ac_auth_int) goto error; - stale = ac->ac_stale || str0cmp(ac->ac_nonce, cda->cda_ac->ac_nonce); + stale = ac->ac_stale || cda->cda_ac->ac_nonce == NULL; if (ac->ac_qop && (cda->cda_cnonce == NULL || ac->ac_stale)) { su_guid_t guid[1]; Modified: freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/msg/msg_parser_util.c ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/msg/msg_parser_util.c (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/msg/msg_parser_util.c Mon Mar 26 14:05:55 2007 @@ -1974,6 +1974,8 @@ return NULL; msg = msg_create(mc, flags); + if (msg == NULL) + return NULL; su_home_preload(msg_home(msg), 1, len + 1024); Modified: freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nta/test_nta.c ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nta/test_nta.c (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nta/test_nta.c Mon Mar 26 14:05:55 2007 @@ -663,6 +663,8 @@ static int test_bad_messages(agent_t *ag) { + BEGIN(); + #if HAVE_DIRENT_H DIR *dir; struct dirent *d; @@ -687,13 +689,10 @@ if (dir == NULL) { fprintf(stderr, "test_nta: cannot find sip torture messages\n"); fprintf(stderr, "test_nta: tried %s\n", name); - return 0; } offset = strlen(name); - BEGIN(); - TEST_1(ag->ag_default_leg = nta_leg_tcreate(ag->ag_agent, leg_callback_500, ag, @@ -720,7 +719,7 @@ sprintf(via, "v: SIP/2.0/UDP is.invalid:%u\r\n", ntohs(su->su_port)); vlen = strlen(via); - for (d = readdir(dir); d; d = readdir(dir)) { + for (d = dir ? readdir(dir) : NULL; d; d = readdir(dir)) { size_t len = strlen(d->d_name); FILE *f; int blen, n; @@ -752,6 +751,8 @@ su_root_step(ag->ag_root, 1); } + TEST_SIZE(su_sendto(s, "", 0, 0, ai->ai_addr, ai->ai_addrlen), 0); + su_close(s); for (i = 0; i < 20; i++) @@ -759,12 +760,12 @@ nta_leg_destroy(ag->ag_default_leg), ag->ag_default_leg = NULL; - closedir(dir); + if (dir) + closedir(dir); - END(); -#else - return 0; #endif /* HAVE_DIRENT_H */ + + END(); } static unsigned char const code[] = Modified: freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/Doxyfile ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/Doxyfile (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/Doxyfile Mon Mar 26 14:05:55 2007 @@ -30,6 +30,9 @@ ALIASES += NUA_EVENT="@var nua_event_e::" ALIASES += END_NUA_EVENT="@par " +ALIASES += \ + NUA_HPARAM_CALLS="nua_invite(), nua_respond(), nua_ack(), nua_prack(), nua_update(), nua_info(), nua_bye(), nua_options(), nua_message(), nua_register(), nua_publish(), nua_refer(),nua_subscribe(), nua_notify(), nua_refer(), nua_notifier()" + VERBATIM_HEADERS = NO @INCLUDE = ../sip/sip.doxyaliases Modified: freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/nua_dialog.h ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/nua_dialog.h (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/nua_dialog.h Mon Mar 26 14:05:55 2007 @@ -301,7 +301,8 @@ unsigned cr_contactize:1; /**< Request needs Contact */ /* Current state */ - unsigned cr_challenged:1; /**< Request was challenged, pending auth */ + unsigned cr_challenged:1; /**< Request was challenged */ + unsigned cr_wait_for_cred:1; /**< Request is pending authentication */ unsigned cr_restarting:1; /**< Request is being restarted */ unsigned cr_reporting:1; /**< Reporting in progress */ unsigned cr_terminating:1; /**< Request terminates the usage */ Modified: freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/nua_params.c ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/nua_params.c (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/nua_params.c Mon Mar 26 14:05:55 2007 @@ -393,6 +393,7 @@ * NUTAG_ALLOW(), SIPTAG_ALLOW(), and SIPTAG_ALLOW_STR() \n * NUTAG_ALLOW_EVENTS(), SIPTAG_ALLOW_EVENTS(), and * SIPTAG_ALLOW_EVENTS_STR() \n + * NUTAG_AUTH_CACHE() \n * NUTAG_AUTOACK() \n * NUTAG_AUTOALERT() \n * NUTAG_AUTOANSWER() \n @@ -778,6 +779,11 @@ else if (tag == nutag_path_enable) { NHP_SET(nhp, path_enable, value != 0); } + /* NUTAG_AUTH_CACHE(auth_cache) */ + else if (tag == nutag_auth_cache) { + if (value >= 0 && value < (tag_value_t)_nua_auth_cache_invalid) + NHP_SET(nhp, auth_cache, (int)value); + } /* NUTAG_REFER_EXPIRES(refer_expires) */ else if (tag == nutag_refer_expires) { NHP_SET(nhp, refer_expires, value); @@ -1363,6 +1369,7 @@ * @param sip NULL * @param tags * NUTAG_APPL_METHOD() \n + * NUTAG_AUTH_CACHE() \n * NUTAG_AUTOACK() \n * NUTAG_AUTOALERT() \n * NUTAG_AUTOANSWER() \n @@ -1546,6 +1553,7 @@ TIF(NUTAG_MEDIA_FEATURES, media_features), TIF(NUTAG_SERVICE_ROUTE_ENABLE, service_route_enable), TIF(NUTAG_PATH_ENABLE, path_enable), + TIF(NUTAG_AUTH_CACHE, auth_cache), TIF(NUTAG_REFER_EXPIRES, refer_expires), TIF(NUTAG_REFER_WITH_ID, refer_with_id), Modified: freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/nua_params.h ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/nua_params.h (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/nua_params.h Mon Mar 26 14:05:55 2007 @@ -95,9 +95,11 @@ unsigned nhp_service_route_enable:1; /** Enable Path */ unsigned nhp_path_enable:1; + /** Authentication cache policy */ + unsigned nhp_auth_cache:1; + /** Always include id with Event: refer */ unsigned nhp_refer_with_id:1; - unsigned:0; /* Default lifetime for implicit subscriptions created by REFER */ @@ -157,6 +159,7 @@ unsigned nhb_media_features:1; unsigned nhb_service_route_enable:1; unsigned nhb_path_enable:1; + unsigned nhb_auth_cache:1; unsigned nhb_refer_with_id:1; unsigned nhb_refer_expires:1; unsigned nhb_substate:1; Modified: freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/nua_session.c ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/nua_session.c (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/nua_session.c Mon Mar 26 14:05:55 2007 @@ -1269,7 +1269,7 @@ /* No INVITE template */ cr == NULL || /* INVITE is in progress or being authenticated */ - cr->cr_orq || cr->cr_challenged) + cr->cr_orq || cr->cr_wait_for_cred) return; /* UPDATE in progress or being authenticated */ @@ -3533,10 +3533,13 @@ nua_callstate_terminated); if (ss && !ss->ss_reporting) { - if (nua_client_is_queued(du->du_cr) && du->du_cr->cr_status < 200) - /* No final response to INVITE received yet */; - else + if (du->du_cr == NULL || + !nua_client_is_queued(du->du_cr) || + du->du_cr->cr_status >= 200) { + /* INVITE is completed, we can zap the session... */; + cr->cr_usage = NULL; nua_session_usage_destroy(nh, ss); + } } } Modified: freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/nua_stack.c ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/nua_stack.c (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/nua_stack.c Mon Mar 26 14:05:55 2007 @@ -90,8 +90,6 @@ static int nh_authorize(nua_handle_t *nh, tag_type_t tag, tag_value_t value, ...); -static int nh_challenge(nua_handle_t *nh, sip_t const *sip); - static void nua_stack_timer(nua_t *nua, su_timer_t *t, su_timer_arg_t *a); /* ---------------------------------------------------------------------- */ @@ -939,33 +937,6 @@ return retval; } -/**@internal - * Collect challenges from response. - * - * @return Number of updated challenges, 0 if no updates found. - * @retval -1 upon error. - */ -static -int nh_challenge(nua_handle_t *nh, sip_t const *sip) -{ - int server = 0, proxy = 0; - - if (sip->sip_www_authenticate) - server = auc_challenge(&nh->nh_auth, nh->nh_home, - sip->sip_www_authenticate, - sip_authorization_class); - - if (sip->sip_proxy_authenticate) - proxy = auc_challenge(&nh->nh_auth, nh->nh_home, - sip->sip_proxy_authenticate, - sip_proxy_authorization_class); - - if (server < 0 || proxy < 0) - return -1; - - return server + proxy; -} - static inline int can_redirect(sip_contact_t const *m, sip_method_t method) { @@ -1023,7 +994,7 @@ if (status > 0) { nua_client_request_t *cr = nh->nh_ds->ds_cr; - if (cr && cr->cr_challenged) { + if (cr && cr->cr_wait_for_cred) { nua_client_restart_request(cr, cr->cr_terminating, tags); } else { @@ -2043,6 +2014,8 @@ /** Restart the request message. * + * A restarted request has not completed successfully. + * * @retval 0 if request is pending * @retval >=1 if error event has been sent */ @@ -2067,6 +2040,8 @@ /** Resend the request message. * + * A resent request has completed once successfully - restarted has not. + * * @retval 0 if request is pending * @retval >=1 if error event has been sent */ @@ -2075,6 +2050,7 @@ { if (cr) { cr->cr_retry_count = 0; + cr->cr_challenged = 0; if (nua_client_is_queued(cr)) { if (terminating) @@ -2223,7 +2199,7 @@ return -1; } - cr->cr_challenged = 0; + cr->cr_wait_for_cred = 0; if (cr->cr_methods->crm_send) return cr->cr_methods->crm_send(cr, msg, sip, NULL); @@ -2264,8 +2240,13 @@ { nua_handle_t *nh = cr->cr_owner; - if (nh->nh_auth && auc_authorize(&nh->nh_auth, msg, sip) < 0) - return nua_client_return(cr, 900, "Cannot add credentials", msg); + if (nh->nh_auth) { + if (cr->cr_challenged || + NH_PGET(nh, auth_cache) == nua_auth_cache_dialog) { + if (auc_authorize(&nh->nh_auth, msg, sip) < 0) + return nua_client_return(cr, 900, "Cannot add credentials", msg); + } + } cr->cr_seq = sip->sip_cseq->cs_seq; /* Save last sequence number */ @@ -2429,14 +2410,31 @@ /* XXX - handle Retry-After */ - if (status == 302) { + if (status == 302 || status == 305) { + sip_route_t r[1]; + if (!can_redirect(sip->sip_contact, cr->cr_method)) return 0; - if (nua_client_set_target(cr, sip->sip_contact->m_url) >= 0) - return nua_client_restart(cr, 100, "Redirected"); + switch (status) { + case 302: + if (nua_client_set_target(cr, sip->sip_contact->m_url) >= 0) + return nua_client_restart(cr, 100, "Redirected"); + break; + + case 305: + sip_route_init(r); + *r->r_url = *sip->sip_contact->m_url; + if (sip_add_dup(cr->cr_msg, cr->cr_sip, (sip_header_t *)r) >= 0) + return nua_client_restart(cr, 100, "Redirected via a proxy"); + break; + + default: + break; + } } + if (status == 423) { unsigned my_expires = 0; @@ -2456,20 +2454,40 @@ } } - if (((status == 401 && sip->sip_www_authenticate) || - (status == 407 && sip->sip_proxy_authenticate)) && - nh_challenge(nh, sip) > 0) { + if ((status == 401 && sip->sip_www_authenticate) || + (status == 407 && sip->sip_proxy_authenticate)) { + int server = 0, proxy = 0; nta_outgoing_t *orq; - if (auc_has_authorization(&nh->nh_auth)) - return nua_client_restart(cr, 100, "Request Authorized by Cache"); - orq = cr->cr_orq, cr->cr_orq = NULL; - cr->cr_challenged = 1; - cr->cr_retry_count++; - nua_client_report(cr, status, phrase, NULL, orq, NULL); - nta_outgoing_destroy(orq); + if (sip->sip_www_authenticate) + server = auc_challenge(&nh->nh_auth, nh->nh_home, + sip->sip_www_authenticate, + sip_authorization_class); + + if (sip->sip_proxy_authenticate) + proxy = auc_challenge(&nh->nh_auth, nh->nh_home, + sip->sip_proxy_authenticate, + sip_proxy_authorization_class); + + if (server >= 0 && proxy >= 0) { + int invalid = cr->cr_challenged && server + proxy == 0; + + cr->cr_challenged = 1; + + if (invalid) + /* Bad username/password */ + auc_clear_credentials(&nh->nh_auth, NULL, NULL); + else if (auc_has_authorization(&nh->nh_auth)) + return nua_client_restart(cr, 100, "Request Authorized by Cache"); + + orq = cr->cr_orq, cr->cr_orq = NULL; + cr->cr_wait_for_cred = 1; + cr->cr_retry_count++; + nua_client_report(cr, status, phrase, NULL, orq, NULL); + nta_outgoing_destroy(orq); - return 1; + return 1; + } } return 0; /* This was a final response that cannot be restarted. */ @@ -2591,8 +2609,18 @@ cr->cr_reporting = 1, nh->nh_ds->ds_reporting = 1; - if (status >= 200 && status < 300) - nh_challenge(nh, sip); /* Collect nextnonce */ + if (nh->nh_auth && sip && + (sip->sip_authentication_info || sip->sip_proxy_authentication_info)) { + /* Collect nextnonce */ + if (sip->sip_authentication_info) + auc_info(&nh->nh_auth, + sip->sip_authentication_info, + sip_authorization_class); + if (sip->sip_proxy_authentication_info) + auc_info(&nh->nh_auth, + sip->sip_proxy_authentication_info, + sip_proxy_authorization_class); + } if ((method != sip_method_invite && status >= 200) || status >= 300) nua_client_request_remove(cr); Modified: freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/nua_tag.c ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/nua_tag.c (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/nua_tag.c Mon Mar 26 14:05:55 2007 @@ -144,6 +144,7 @@ tag_typedef_t nutag_path_enable = BOOLTAG_TYPEDEF(path_enable); tag_typedef_t nutag_service_route_enable = BOOLTAG_TYPEDEF(service_route_enable); +tag_typedef_t nutag_auth_cache = INTTAG_TYPEDEF(auth_cache); tag_typedef_t nutag_detect_network_updates = UINTTAG_TYPEDEF(detect_network_updates); Modified: freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/sofia-sip/nua_tag.h ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/sofia-sip/nua_tag.h (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/sofia-sip/nua_tag.h Mon Mar 26 14:05:55 2007 @@ -451,8 +451,8 @@ * * @par Used with * nua_invite() \n - * nua_set_params() \n - * nua_get_params() + * nua_set_params(), nua_set_hparams(), + * nua_get_params(), nua_get_hparams() * * @par Parameter type * int (enum nua_af) @@ -1247,6 +1247,38 @@ #define NUTAG_AUTH_REF(x) nutag_auth_ref, tag_str_vr(&(x)) SOFIAPUBVAR tag_typedef_t nutag_auth_ref; +/** Authentication caching policy + * + * @par Used with + * nua_set_params(), nua_set_hparams() \n + * nua_get_params(), nua_get_hparams() \n + * @NUA_HPARAM_CALLS + * + * @par Parameter type + * enum nua_auth_cache + * + * @par Values + * - nua_auth_cache_dialog (0) - include credentials within dialog + * - nua_auth_cache_challenged (1) - include credentials only when + * challenged + * + * Corresponding tag taking reference parameter is NUTAG_AUTH_CACHE_REF() + */ +#define NUTAG_AUTH_CACHE(x) nutag_auth_cache, tag_int_v(x) +SOFIAPUBVAR tag_typedef_t nutag_auth_cache; + +#define NUTAG_AUTH_CACHE_REF(x) nutag_auth_cache_ref, tag_int_vr(&(x)) +SOFIAPUBVAR tag_typedef_t nutag_auth_cache_ref; + +/** Authentication caching policy */ +enum nua_auth_cache { + /** Include credentials within dialog (default) */ + nua_auth_cache_dialog = 0, + /** Include credentials only when challenged */ + nua_auth_cache_challenged = 1, + _nua_auth_cache_invalid +}; + /** Keepalive interval in milliseconds. * * This setting applies to OPTIONS/STUN keepalives. See documentation Modified: freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/test_100rel.c ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/test_100rel.c (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/test_100rel.c Mon Mar 26 14:05:55 2007 @@ -404,17 +404,21 @@ TEST_1(is_answer_recv(e->data->e_tags)); TEST_1(!is_offer_sent(e->data->e_tags)); - if (md5 && !md5sess) { - TEST_1(e = e->next); TEST_E(e->data->e_event, nua_r_prack); - TEST(e->data->e_status, 407); + TEST_1(e = e->next); TEST_E(e->data->e_event, nua_r_prack); + + if (e->data->e_status != 200 && md5 && !md5sess) { + if (e->data->e_status != 100) { + TEST(e->data->e_status, 407); + } TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state); TEST(callstate(e->data->e_tags), nua_callstate_proceeding); TEST_1(!is_answer_recv(e->data->e_tags)); TEST_1(!is_offer_sent(e->data->e_tags)); + + TEST_1(e = e->next); TEST_E(e->data->e_event, nua_r_prack); } - TEST_1(e = e->next); TEST_E(e->data->e_event, nua_r_prack); TEST(e->data->e_status, 200); TEST_1(e = e->next); TEST_E(e->data->e_event, nua_r_invite); Modified: freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/test_call_reject.c ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/test_call_reject.c (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/test_call_reject.c Mon Mar 26 14:05:55 2007 @@ -261,7 +261,7 @@ /* ------------------------------------------------------------------------ */ -int reject_302(CONDITION_PARAMS); +int reject_302(CONDITION_PARAMS), reject_305(CONDITION_PARAMS); int reject_604(CONDITION_PARAMS); /* @@ -281,6 +281,7 @@ |<---604 Nowhere-----| |--------ACK-------->| */ + int reject_302(CONDITION_PARAMS) { if (!(check_handle(ep, call, nh, SIP_500_INTERNAL_SERVER_ERROR))) @@ -301,6 +302,33 @@ case nua_callstate_terminated: if (call) nua_handle_destroy(call->nh), call->nh = NULL; + ep->next_condition = reject_305; + return 0; + default: + return 0; + } +} + +int reject_305(CONDITION_PARAMS) +{ + if (!(check_handle(ep, call, nh, SIP_500_INTERNAL_SERVER_ERROR))) + return 0; + + save_event_in_list(ctx, event, ep, call); + + switch (callstate(tags)) { + case nua_callstate_received: + { + sip_contact_t m[1]; + *m = *ep->contact; + m->m_url->url_user = "305"; + m->m_url->url_params = "lr=1"; + RESPOND(ep, call, nh, SIP_305_USE_PROXY, SIPTAG_CONTACT(m), TAG_END()); + } + return 0; + case nua_callstate_terminated: + if (call) + nua_handle_destroy(call->nh), call->nh = NULL; ep->next_condition = reject_604; return 0; default: @@ -308,6 +336,7 @@ } } + int reject_604(CONDITION_PARAMS) { if (!(check_handle(ep, call, nh, SIP_500_INTERNAL_SERVER_ERROR))) @@ -338,6 +367,7 @@ struct endpoint *a = &ctx->a, *b = &ctx->b; struct call *a_call = a->call, *b_call = b->call; struct event *e; + sip_t const *sip; /* Make call reject-3 */ if (print_headings) @@ -388,6 +418,12 @@ TEST(callstate(e->data->e_tags), nua_callstate_calling); /* CALLING */ TEST_1(is_offer_sent(e->data->e_tags)); TEST_1(e = e->next); TEST_E(e->data->e_event, nua_r_invite); + TEST(e->data->e_status, 100); + TEST(sip_object(e->data->e_msg)->sip_status->st_status, 305); + TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state); + TEST(callstate(e->data->e_tags), nua_callstate_calling); /* CALLING */ + TEST_1(is_offer_sent(e->data->e_tags)); + TEST_1(e = e->next); TEST_E(e->data->e_event, nua_r_invite); TEST(e->data->e_status, 180); TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state); TEST(callstate(e->data->e_tags), nua_callstate_proceeding); /* PROCEEDING */ @@ -415,6 +451,18 @@ TEST(callstate(e->data->e_tags), nua_callstate_received); /* RECEIVED */ TEST_1(is_offer_recv(e->data->e_tags)); TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state); + TEST(callstate(e->data->e_tags), nua_callstate_terminated); /* TERMINATED */ + TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_invite); + TEST(e->data->e_status, 100); + TEST_1(sip = sip_object(e->data->e_msg)); + TEST_1(sip->sip_request); + TEST_S(sip->sip_request->rq_url->url_user, "302"); + TEST_1(sip->sip_route); + TEST_S(sip->sip_route->r_url->url_user, "305"); + TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state); + TEST(callstate(e->data->e_tags), nua_callstate_received); /* RECEIVED */ + TEST_1(is_offer_recv(e->data->e_tags)); + TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state); TEST(callstate(e->data->e_tags), nua_callstate_early); /* EARLY */ TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state); TEST(callstate(e->data->e_tags), nua_callstate_terminated); /* TERMINATED */ @@ -724,7 +772,7 @@ sip_t const *sip; if (print_headings) - printf("TEST NUA-4.6: invalid challenge \n"); + printf("TEST NUA-4.6.1: invalid challenge \n"); a_call->sdp = "m=audio 5008 RTP/AVP 8"; b_call->sdp = "m=audio 5010 RTP/AVP 0 8"; @@ -773,7 +821,160 @@ nua_handle_destroy(b_call->nh), b_call->nh = NULL; if (print_headings) - printf("TEST NUA-4.6: PASSED\n"); + printf("TEST NUA-4.6.1: PASSED\n"); + + END(); +} + + +/* ------------------------------------------------------------------------ */ + +/* Reject call with 401, twice */ + +/* + A reject-401-bad B + | | + |-------INVITE------>| + |<----100 Trying-----| + |<--------401--------| + |---------ACK------->| + | | + |-------INVITE------>| + |<----100 Trying-----| + |<--------401--------| + |---------ACK------->| +*/ + +int reject_401_bad(CONDITION_PARAMS) +{ + if (!(check_handle(ep, call, nh, SIP_500_INTERNAL_SERVER_ERROR))) + return 0; + + save_event_in_list(ctx, event, ep, call); + + switch (callstate(tags)) { + case nua_callstate_received: + RESPOND(ep, call, nh, SIP_401_UNAUTHORIZED, + /* Send a challenge that we do not grok */ + SIPTAG_WWW_AUTHENTICATE_STR("Digest realm=\"No hope\", " + "nonce=\"goO541ftNrw327aWpu2\", " + "algorithm=MD5, " + "qop=\"auth\""), + TAG_END()); + return 0; + case nua_callstate_terminated: + if (call) + nua_handle_destroy(call->nh), call->nh = NULL; + if (ep->flags.bit0) /* Terminate 2 calls */ + return 1; + ep->flags.bit0 = 1; + return 0; + default: + return 0; + } +} + +int authenticate_once(CONDITION_PARAMS) +{ + if (!(check_handle(ep, call, nh, SIP_500_INTERNAL_SERVER_ERROR))) + return 0; + + save_event_in_list(ctx, event, ep, call); + + if (event == nua_r_invite && status == 401) { + if (ep->flags.bit0) { + nua_handle_destroy(nh); if (call) call->nh = NULL; + return 1; + } + ep->flags.bit0 = 1; + AUTHENTICATE(ep, call, nh, NUTAG_AUTH("Digest:\"No hope\":jaska:secret"), + SIPTAG_SUBJECT_STR("Got 401"), + TAG_END()); + return 0; + } + + switch (callstate(tags)) { + case nua_callstate_terminated: + if (call) + nua_handle_destroy(call->nh), call->nh = NULL; + return 1; + default: + return 0; + } +} + + +int test_reject_401_bad(struct context *ctx) +{ + BEGIN(); + + struct endpoint *a = &ctx->a, *b = &ctx->b; + struct call *a_call = a->call, *b_call = b->call; + struct event const *e; + sip_t const *sip; + + if (print_headings) + printf("TEST NUA-4.6.2: bad username/password\n"); + + a_call->sdp = "m=audio 5008 RTP/AVP 8"; + + TEST_1(a_call->nh = nua_handle(a->nua, a_call, SIPTAG_TO(b->to), TAG_END())); + INVITE(a, a_call, a_call->nh, + TAG_IF(!ctx->proxy_tests, NUTAG_URL(b->contact->m_url)), + SIPTAG_SUBJECT_STR("reject-401-bad"), + SOATAG_USER_SDP_STR(a_call->sdp), + TAG_END()); + + run_ab_until(ctx, -1, authenticate_once, -1, reject_401_bad); + + /* + Client transitions + INIT -(C1)-> CALLING -(C6a)-> TERMINATED/INIT + */ + TEST_1(e = a->events->head); TEST_E(e->data->e_event, nua_i_state); + TEST(callstate(e->data->e_tags), nua_callstate_calling); /* CALLING */ + TEST_1(is_offer_sent(e->data->e_tags)); + TEST_1(e = e->next); TEST_E(e->data->e_event, nua_r_invite); + TEST(sip_object(e->data->e_msg)->sip_status->st_status, 401); + TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state); + TEST(callstate(e->data->e_tags), nua_callstate_calling); /* CALLING */ + TEST_1(is_offer_sent(e->data->e_tags)); + TEST_1(e = e->next); TEST_E(e->data->e_event, nua_r_invite); + TEST(sip_object(e->data->e_msg)->sip_status->st_status, 401); + TEST_1(!e->next); + + free_events_in_list(ctx, a->events); + + /* + Server transitions: + INIT -(S1)-> RECEIVED -(S6a)-> TERMINATED + */ + TEST_1(e = b->events->head); TEST_E(e->data->e_event, nua_i_invite); + TEST_1(sip = sip_object(e->data->e_msg)); + TEST(e->data->e_status, 100); + TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state); + TEST(callstate(e->data->e_tags), nua_callstate_received); /* RECEIVED */ + TEST_1(is_offer_recv(e->data->e_tags)); + TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state); + TEST(callstate(e->data->e_tags), nua_callstate_terminated); /* TERMINATED */ + + TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_invite); + TEST_1(sip = sip_object(e->data->e_msg)); + TEST(e->data->e_status, 100); + TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state); + TEST(callstate(e->data->e_tags), nua_callstate_received); /* RECEIVED */ + TEST_1(is_offer_recv(e->data->e_tags)); + TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state); + TEST(callstate(e->data->e_tags), nua_callstate_terminated); /* TERMINATED */ + TEST_1(!e->next); + + free_events_in_list(ctx, b->events); + + nua_handle_destroy(a_call->nh), a_call->nh = NULL; + nua_handle_destroy(b_call->nh), b_call->nh = NULL; + + if (print_headings) + printf("TEST NUA-4.6.2: PASSED\n"); END(); } @@ -976,7 +1177,7 @@ struct endpoint *a = &ctx->a, *b = &ctx->b; struct call *a_call = a->call, *b_call = b->call; struct event *e; - struct nat_filter *f; + struct nat_filter *f, *f2; if (print_headings) printf("TEST NUA-4.7: check for error and timeout handling\n"); @@ -993,6 +1194,8 @@ TEST_1(a_call->nh = nua_handle(a->nua, a_call, SIPTAG_TO(b->to), TAG_END())); TEST_1(f = test_nat_add_filter(ctx->nat, filter_200_OK, NULL, nat_inbound)); + TEST_1(f2 = test_nat_add_filter(ctx->nat, filter_200_OK, + NULL, nat_outbound)); INVITE(a, a_call, a_call->nh, TAG_IF(!ctx->proxy_tests, NUTAG_URL(b->contact->m_url)), @@ -1014,7 +1217,7 @@ | X-----200--------| | | |<--------BYE--------| - |--------200 OK----->| + |--------200 OK---X | */ @@ -1052,6 +1255,7 @@ TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state); TEST(callstate(e->data->e_tags), nua_callstate_terminating); /* TERMINATING */ TEST_1(e = e->next); TEST_E(e->data->e_event, nua_r_bye); + TEST(e->data->e_status, 408); TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state); TEST(callstate(e->data->e_tags), nua_callstate_terminated); /* TERMINATED */ TEST_1(!e->next); @@ -1062,6 +1266,7 @@ nua_handle_destroy(b_call->nh), b_call->nh = NULL; TEST_1(test_nat_remove_filter(ctx->nat, f) == 0); + TEST_1(test_nat_remove_filter(ctx->nat, f2) == 0); if (print_headings) printf("TEST NUA-4.7.1: PASSED\n"); @@ -1262,3 +1467,19 @@ return event == nua_i_state && callstate(tags) == nua_callstate_terminated; } + +/* ---------------------------------------------------------------------- */ + +int test_rejects(struct context *ctx) +{ + return + test_reject_401_bad(ctx) || + test_reject_a(ctx) || + test_reject_b(ctx) || + test_reject_302(ctx) || + test_reject_401(ctx) || + test_mime_negotiation(ctx) || + test_call_timeouts(ctx) || + test_reject_401_aka(ctx) || + 0; +} Modified: freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/test_init.c ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/test_init.c (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/test_init.c Mon Mar 26 14:05:55 2007 @@ -110,7 +110,8 @@ AUTHTAG_OPAQUE("kuik"), AUTHTAG_DB(passwd_name), AUTHTAG_QOP("auth-int"), - AUTHTAG_ALGORITHM("md5-sess"), + AUTHTAG_ALGORITHM("md5"), + AUTHTAG_NEXT_EXPIRES(60), TAG_IF(ctx->proxy_logging, TPTAG_LOG(1)), TAG_END()); Modified: freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/test_nua.c ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/test_nua.c (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/test_nua.c Mon Mar 26 14:05:55 2007 @@ -307,13 +307,7 @@ while (retval == 0) { retval |= test_basic_call(ctx); SINGLE_FAILURE_CHECK(); - retval |= test_reject_a(ctx); SINGLE_FAILURE_CHECK(); - retval |= test_reject_b(ctx); SINGLE_FAILURE_CHECK(); - retval |= test_reject_302(ctx); SINGLE_FAILURE_CHECK(); - retval |= test_reject_401(ctx); SINGLE_FAILURE_CHECK(); - retval |= test_mime_negotiation(ctx); SINGLE_FAILURE_CHECK(); - retval |= test_call_timeouts(ctx); SINGLE_FAILURE_CHECK(); - retval |= test_reject_401_aka(ctx); SINGLE_FAILURE_CHECK(); + retval |= test_rejects(ctx); SINGLE_FAILURE_CHECK(); retval |= test_call_cancel(ctx); SINGLE_FAILURE_CHECK(); retval |= test_call_destroy(ctx); SINGLE_FAILURE_CHECK(); retval |= test_offer_answer(ctx); SINGLE_FAILURE_CHECK(); Modified: freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/test_nua.h ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/test_nua.h (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/test_nua.h Mon Mar 26 14:05:55 2007 @@ -330,10 +330,7 @@ int test_basic_call(struct context *ctx); int test_offer_answer(struct context *ctx); -int test_reject_a(struct context *ctx); -int test_reject_b(struct context *ctx); -int test_reject_302(struct context *ctx); -int test_reject_401(struct context *ctx); +int test_rejects(struct context *ctx); int test_mime_negotiation(struct context *ctx); int test_call_timeouts(struct context *ctx); int test_reject_401_aka(struct context *ctx); Modified: freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/test_nua_params.c ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/test_nua_params.c (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/test_nua_params.c Mon Mar 26 14:05:55 2007 @@ -193,6 +193,7 @@ NUTAG_MEDIA_FEATURES(1), NUTAG_SERVICE_ROUTE_ENABLE(0), NUTAG_PATH_ENABLE(0), + NUTAG_AUTH_CACHE(nua_auth_cache_challenged), NUTAG_REFER_EXPIRES(333), NUTAG_REFER_WITH_ID(0), NUTAG_SUBSTATE(nua_substate_pending), @@ -268,6 +269,7 @@ int media_features = -1; int service_route_enable = -1; int path_enable = -1; + int auth_cache = -1; unsigned refer_expires = (unsigned)-1; int refer_with_id = -1; int substate = -1; @@ -331,6 +333,7 @@ NUTAG_MEDIA_FEATURES_REF(media_features), NUTAG_SERVICE_ROUTE_ENABLE_REF(service_route_enable), NUTAG_PATH_ENABLE_REF(path_enable), + NUTAG_AUTH_CACHE_REF(auth_cache), NUTAG_REFER_EXPIRES_REF(refer_expires), NUTAG_REFER_WITH_ID_REF(refer_with_id), NUTAG_SUBSTATE_REF(substate), @@ -361,7 +364,7 @@ NUTAG_INSTANCE_REF(instance), TAG_END()); - TEST(n, 47); + TEST(n, 48); TEST_S(sip_header_as_string(tmphome, (void *)from), Alice); TEST_S(from_str, Alice); @@ -391,6 +394,7 @@ TEST(media_features, 1); TEST(service_route_enable, 0); TEST(path_enable, 0); + TEST(auth_cache, nua_auth_cache_challenged); TEST(refer_expires, 333); TEST(refer_with_id, 0); TEST(substate, nua_substate_pending); @@ -455,6 +459,7 @@ int media_features = -1; int service_route_enable = -1; int path_enable = -1; + int auth_cache = -1; unsigned refer_expires = (unsigned)-1; int refer_with_id = -1; int substate = -1; @@ -513,6 +518,7 @@ NUTAG_MEDIA_FEATURES_REF(media_features), NUTAG_SERVICE_ROUTE_ENABLE_REF(service_route_enable), NUTAG_PATH_ENABLE_REF(path_enable), + NUTAG_AUTH_CACHE_REF(auth_cache), NUTAG_SUBSTATE_REF(substate), SIPTAG_SUPPORTED_REF(supported), @@ -565,6 +571,7 @@ TEST(media_features, -1); TEST(service_route_enable, -1); TEST(path_enable, -1); + TEST(auth_cache, -1); TEST(refer_expires, (unsigned)-1); TEST(refer_with_id, -1); TEST(substate, -1); Modified: freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/test_register.c ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/test_register.c (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/nua/test_register.c Mon Mar 26 14:05:55 2007 @@ -55,6 +55,7 @@ struct event *e; sip_t const *sip; sip_cseq_t cseq[1]; + int seen_401; if (ctx->p) test_proxy_set_expiration(ctx->p, 5, 5, 10); @@ -189,6 +190,8 @@ REGISTER(b, b_reg, b_reg->nh, SIPTAG_TO(b->to), SIPTAG_CONTACT(m), + /* Do not include credentials unless challenged */ + NUTAG_AUTH_CACHE(nua_auth_cache_challenged), TAG_END()); } run_ab_until(ctx, -1, save_events, -1, save_until_final_response); @@ -213,7 +216,8 @@ TEST_1(sip->sip_contact); TEST_S(sip->sip_contact->m_display, "B"); TEST_S(sip->sip_contact->m_url->url_user, "b"); - + free_events_in_list(ctx, b->events); + if (print_headings) printf("TEST NUA-2.3.2: PASSED\n"); @@ -318,11 +322,21 @@ TEST_1(!e->next); free_events_in_list(ctx, a->events); + seen_401 = 0; + for (e = b->events->head; e; e = e->next) { TEST_E(e->data->e_event, nua_r_register); - TEST(e->data->e_status, 200); TEST_1(sip = sip_object(e->data->e_msg)); - TEST_1(sip->sip_contact); + + if (e->data->e_status == 200) { + TEST(e->data->e_status, 200); + TEST_1(seen_401); + TEST_1(sip->sip_contact); + } + else if (sip->sip_status && sip->sip_status->st_status == 401) { + seen_401 = 1; + } + if (!e->next) break; } @@ -680,6 +694,10 @@ run_b_until(ctx, -1, save_until_final_response); TEST_1(e = b->events->head); TEST_E(e->data->e_event, nua_r_unregister); + if (e->data->e_status == 100) { + TEST_1(e = e->next); + TEST_E(e->data->e_event, nua_r_unregister); + } TEST(e->data->e_status, 200); TEST_1(sip = sip_object(e->data->e_msg)); TEST_1(!sip->sip_contact); Added: freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/sip/tests/10052.txt ============================================================================== --- (empty file) +++ freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/sip/tests/10052.txt Mon Mar 26 14:05:55 2007 @@ -0,0 +1,20 @@ +INVITE sip:1234@10.50.71.28 SIP/2.0 +To: <sip:1234@10.50.71.28> +From: "Displayname" <sip:1234@testaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.example.local:5060>;tag=10052 +Via: SIP/2.0/UDP 10.50.71.29:5060;branch=z9hG4bK10052t1174659568681 +Call-ID: s0c00010052i0t1174659568681@10.50.71.29 +Contact: "999" <sip:999@10.50.71.29;transport=udp> +Content-Length: 180 +Content-Type: application/sdp +CSeq: 1 INVITE +Max-Forwards: 70 + +v=0 +o=999 1 1 IN IP4 10.50.71.29 +s=Codenomicon SIP UAS Test Tool 3.0.2 (http://www.codenomicon.com/) +c=IN IP4 10.50.71.29 +t=0 0 +m=audio 49152 RTP/AVP 0 +a=rtpmap:0 PCMU/8000 \ No newline at end of file Modified: freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/su/sofia-sip/su_wait.h ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/su/sofia-sip/su_wait.h (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/su/sofia-sip/su_wait.h Mon Mar 26 14:05:55 2007 @@ -46,9 +46,7 @@ #include "sofia-sip/su_time.h" #endif -#if SU_HAVE_KQUEUE -#include <sys/event.h> -#elif SU_HAVE_POLL +#if SU_HAVE_POLL #include <sys/poll.h> #endif Modified: freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/tport/tport_type_udp.c ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/tport/tport_type_udp.c (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/tport/tport_type_udp.c Mon Mar 26 14:05:55 2007 @@ -252,6 +252,11 @@ su_strerror(err), err)); return -1; } + if (N == 0) { + su_recv(self->tp_socket, sample, 1, 0); + SU_DEBUG_3(("tport(%p): zero length packet", (void *)self)); + return 0; + } #endif veclen = tport_recv_iovec(self, &self->tp_msg, iovec, N, 1); Modified: freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/url/torture_url.c ============================================================================== --- freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/url/torture_url.c (original) +++ freeswitch/branches/mikej/sofiasip-upgrade/libs/sofia-sip/libsofia-sip-ua/url/torture_url.c Mon Mar 26 14:05:55 2007 @@ -403,6 +403,10 @@ TEST_S(u->url_params, "isfocus"); TEST_1(!url_have_transport(u)); + u = url_hdup(home, (void *)"sip:%22foo%22@172.21.55.55:5060"); + TEST_1(u); + TEST_S(u->url_user, "%22foo%22"); + a = url_hdup(home, (void *)"sip:172.21.55.55:5060"); b = url_hdup(home, (void *)"sip:172.21.55.55"); TEST_1(a); TEST_1(b);
participants (1)
-
Freeswitch SVN