Index: channels/chan_sip.c =================================================================== --- channels/chan_sip.c (revision 236) +++ channels/chan_sip.c (revision 237) @@ -16529,6 +16529,23 @@ } set_outgoing_hold(p, FALSE); break; + default: + /* We should treat unrecognized 9xx as 900. 400 is actually + specified as a possible response, but any 4-6xx is + theoretically possible. */ + + if (resp <299) { /* 1xx cases don't get here */ + ast_log(LOG_WARNING, "SIP transfer to %s had unxpected 2xx response (%d), confusion is possible. \n", p->refer->refer_to, resp); + } else { + ast_log(LOG_WARNING, "SIP transfer to %s with response (%d). \n", p->refer->refer_to, resp); + } + p->refer->status = REFER_FAILED; + if (p->owner) { + ast_queue_control_data(p->owner, AST_CONTROL_TRANSFER, &message, sizeof(message)); + } + set_outgoing_hold(p, FALSE); + break; + } } @@ -16816,6 +16833,9 @@ need to hang around for something more "definitive" */ if (resp != 100) handle_response_peerpoke(p, resp, req); + } else if (sipmethod == SIP_REFER && + resp >= 200) { /* Need to clean up for refer failures */ + handle_response_refer(p, resp, rest, req, seqno); } else if (ast_test_flag(&p->flags[0], SIP_OUTGOING)) { switch(resp) { case 100: /* 100 Trying */ @@ -16854,18 +16874,12 @@ ast_set_flag(&p->flags[1], SIP_PAGE2_DIALOG_ESTABLISHED); } break; - case 202: /* Transfer accepted */ - if (sipmethod == SIP_REFER) - handle_response_refer(p, resp, rest, req, seqno); - break; case 401: /* Not www-authorized on SIP method */ case 407: /* Proxy auth required */ if (sipmethod == SIP_INVITE) handle_response_invite(p, resp, rest, req, seqno); else if (sipmethod == SIP_NOTIFY) handle_response_notify(p, resp, rest, req, seqno); - else if (sipmethod == SIP_REFER) - handle_response_refer(p, resp, rest, req, seqno); else if (p->registry && sipmethod == SIP_REGISTER) res = handle_response_register(p, resp, rest, req, seqno); else if (sipmethod == SIP_BYE) { @@ -16930,8 +16944,6 @@ case 481: /* Call leg does not exist */ if (sipmethod == SIP_INVITE) { handle_response_invite(p, resp, rest, req, seqno); - } else if (sipmethod == SIP_REFER) { - handle_response_refer(p, resp, rest, req, seqno); } else if (sipmethod == SIP_BYE) { /* The other side has no transaction to bye, just assume it's all right then */ @@ -16964,17 +16976,9 @@ case 501: /* Not Implemented */ if (sipmethod == SIP_INVITE) handle_response_invite(p, resp, rest, req, seqno); - else if (sipmethod == SIP_REFER) - handle_response_refer(p, resp, rest, req, seqno); else ast_log(LOG_WARNING, "Host '%s' does not implement '%s'\n", ast_inet_ntoa(p->sa.sin_addr), msg); break; - case 603: /* Declined transfer */ - if (sipmethod == SIP_REFER) { - handle_response_refer(p, resp, rest, req, seqno); - break; - } - /* Fallthrough */ default: if ((resp >= 300) && (resp < 700)) { /* Fatal response */ @@ -17013,11 +17017,6 @@ case 410: /* Gone */ case 400: /* Bad Request */ case 500: /* Server error */ - if (sipmethod == SIP_REFER) { - handle_response_refer(p, resp, rest, req, seqno); - break; - } - /* Fall through */ case 502: /* Bad gateway */ case 503: /* Service Unavailable */ case 504: /* Server Timeout */ @@ -17101,15 +17100,9 @@ /* Ok, we're ready to go */ p->needdestroy = 1; break; - case 202: /* Transfer accepted */ - if (sipmethod == SIP_REFER) - handle_response_refer(p, resp, rest, req, seqno); - break; case 401: /* www-auth */ case 407: - if (sipmethod == SIP_REFER) - handle_response_refer(p, resp, rest, req, seqno); - else if (sipmethod == SIP_INVITE) + if (sipmethod == SIP_INVITE) handle_response_invite(p, resp, rest, req, seqno); else if (sipmethod == SIP_BYE) { if (p->authtries == MAX_AUTHTRIES || do_proxy_auth(p, req, resp, sipmethod, 0)) { @@ -17131,15 +17124,7 @@ case 501: /* Not Implemented */ if (sipmethod == SIP_INVITE) handle_response_invite(p, resp, rest, req, seqno); - else if (sipmethod == SIP_REFER) - handle_response_refer(p, resp, rest, req, seqno); break; - case 603: /* Declined transfer */ - if (sipmethod == SIP_REFER) { - handle_response_refer(p, resp, rest, req, seqno); - break; - } - /* Fallthrough */ default: /* Errors without handlers */ if ((resp >= 100) && (resp < 200)) { if (sipmethod == SIP_INVITE) { /* re-invite */