diff -Naur libpri-issue14068-2009-01-30/pri.c libpri-issue14068-2009-01-30.new/pri.c --- libpri-issue14068-2009-01-30/pri.c 2009-01-30 14:30:11.000000000 +0100 +++ libpri-issue14068-2009-01-30.new/pri.c 2009-01-30 14:40:47.000000000 +0100 @@ -566,8 +566,8 @@ if (pri->switchtype == PRI_SWITCH_QSIG) { switch (call->ourcallstate) { case Q931_CALL_STATE_ACTIVE: - /* immediately send callTransferComplete APDU */ - qsig_initiate_call_transfer_complete(pri, call); + /* immediately send callTransferComplete APDU, callStatus=answered(0) */ + qsig_initiate_call_transfer_complete(pri, call, 0); break; case Q931_CALL_STATE_OVERLAP_RECEIVING: case Q931_CALL_STATE_INCOMING_CALL_PROCEEDING: @@ -649,17 +649,29 @@ call->divertedtoreason = redirecting->reason; if (pri->switchtype == PRI_SWITCH_QSIG) { - call->divertedstate = DIVERTEDSTATE_DIVERTED; + switch (call->ourcallstate) { + case Q931_CALL_STATE_ACTIVE: + /* immediately send callTransferComplete APDU, callStatus=alerting(1) */ + qsig_initiate_call_transfer_complete(pri, call, 1); + break; + case Q931_CALL_STATE_OVERLAP_RECEIVING: + case Q931_CALL_STATE_INCOMING_CALL_PROCEEDING: + call->divertedstate = DIVERTEDSTATE_DIVERTED; - if (call->divertedtonum[0]) { - /* immediately send divertingLegInformation1 APDU */ - qsig_initiate_diverting_leg_information1(pri, call); - call->divertedstate = DIVERTEDSTATE_DIVLEGINFO1SEND; - } - if ((call->divertedstate == DIVERTEDSTATE_DIVLEGINFO1SEND) && call->divertedtoname[0]) { - /* queue divertingLegInformation3 to be send with next Q931_ALERTING */ - rose_diverting_leg_information3_encode(pri, call, Q931_ALERTING); - call->divertedstate = DIVERTEDSTATE_DIVLEGINFO3SEND; + if (call->divertedtonum[0]) { + /* immediately send divertingLegInformation1 APDU */ + qsig_initiate_diverting_leg_information1(pri, call); + call->divertedstate = DIVERTEDSTATE_DIVLEGINFO1SEND; + } + if ((call->divertedstate == DIVERTEDSTATE_DIVLEGINFO1SEND) && call->divertedtoname[0]) { + /* queue divertingLegInformation3 to be send with next Q931_ALERTING */ + rose_diverting_leg_information3_encode(pri, call, Q931_ALERTING); + call->divertedstate = DIVERTEDSTATE_DIVLEGINFO3SEND; + } + break; + default: + pri_message(pri, "Redirecting update in state %d\n", call->ourcallstate); + break; } } diff -Naur libpri-issue14068-2009-01-30/pri_facility.c libpri-issue14068-2009-01-30.new/pri_facility.c --- libpri-issue14068-2009-01-30/pri_facility.c 2009-01-30 14:30:11.000000000 +0100 +++ libpri-issue14068-2009-01-30.new/pri_facility.c 2009-01-30 14:45:54.000000000 +0100 @@ -3056,7 +3056,7 @@ return -1; } -static int rose_call_transfer_complete_encode(struct pri *pri, q931_call *call) +static int rose_call_transfer_complete_encode(struct pri *pri, q931_call *call, int call_status) { int i = 0, compsp = 0; struct rose_component *comp, *compstk[10]; @@ -3150,13 +3150,17 @@ ASN1_FIXUP(compstk, compsp, buffer, i); } - /* callStatus */ - /* - not included, default: answered(0) - */ - + if (call_status) { + /* callStatus (0x0a,0x01,0x01) */ + ASN1_ADD_BYTECOMP(comp, ASN1_ENUMERATED, buffer, i, 1); /* alerting(1) */ + } else { + /* callStatus */ + /* - not included, default: answered(0) - */ #if 0 - /* callStatus (0x0a,0x01,0x00) */ - ASN1_ADD_BYTECOMP(comp, ASN1_ENUMERATED, buffer, i, 0); /* answered(0) */ + /* callStatus (0x0a,0x01,0x00) */ + ASN1_ADD_BYTECOMP(comp, ASN1_ENUMERATED, buffer, i, 0); /* answered(0) */ #endif + } ASN1_FIXUP(compstk, compsp, buffer, i); ASN1_FIXUP(compstk, compsp, buffer, i); @@ -4155,9 +4159,9 @@ return 0; } -int qsig_initiate_call_transfer_complete(struct pri *pri, q931_call *call) +int qsig_initiate_call_transfer_complete(struct pri *pri, q931_call *call, int call_status) { - rose_call_transfer_complete_encode(pri, call); + rose_call_transfer_complete_encode(pri, call, call_status); if (q931_facility(pri, call)) { pri_message(pri, "Could not schedule facility message for callTransferComplete\n"); diff -Naur libpri-issue14068-2009-01-30/pri_facility.h libpri-issue14068-2009-01-30.new/pri_facility.h --- libpri-issue14068-2009-01-30/pri_facility.h 2009-01-30 14:30:11.000000000 +0100 +++ libpri-issue14068-2009-01-30.new/pri_facility.h 2009-01-30 14:40:39.000000000 +0100 @@ -328,7 +328,7 @@ int qsig_initiate_diverting_leg_information1(struct pri *pri, q931_call *call); -int qsig_initiate_call_transfer_complete(struct pri *pri, q931_call *call); +int qsig_initiate_call_transfer_complete(struct pri *pri, q931_call *call, int call_status); int rose_diverting_leg_information1_encode(struct pri *pri, q931_call *call); diff -Naur libpri-issue14068-2009-01-30/q931.c libpri-issue14068-2009-01-30.new/q931.c --- libpri-issue14068-2009-01-30/q931.c 2009-01-30 14:30:11.000000000 +0100 +++ libpri-issue14068-2009-01-30.new/q931.c 2009-01-30 14:56:20.000000000 +0100 @@ -3116,8 +3116,11 @@ c->callerpres = PRES_NUMBER_NOT_AVAILABLE; } if (req->redirectingnum) { - libpri_copy_string(c->redirectingname, req->redirectingname, sizeof(c->redirectingname)); libpri_copy_string(c->redirectingnum, req->redirectingnum, sizeof(c->redirectingnum)); + if (req->redirectingname) + libpri_copy_string(c->redirectingname, req->redirectingname, sizeof(c->redirectingname)); + else + c->redirectingname[0] = '\0'; c->redirectingplan = req->redirectingplan; if ((pri->switchtype == PRI_SWITCH_DMS100) || (pri->switchtype == PRI_SWITCH_ATT4ESS)) { @@ -3682,7 +3685,7 @@ pri->ev.ringing.calledplan = c->divertedtoplan; } else { libpri_copy_string(pri->ev.ringing.calledname, c->calledname, sizeof(pri->ev.ringing.calledname)); - libpri_copy_string(pri->ev.ringing.callednum, c->callednum, sizeof(pri->ev.ringing.callednum)); + libpri_copy_string(pri->ev.ringing.callednum, (c->divertedtonum[0]) ? c->divertedtonum : c->callednum, sizeof(pri->ev.ringing.callednum)); pri->ev.ringing.calledpres = PRES_ALLOWED_USER_NUMBER_NOT_SCREENED; pri->ev.ringing.calledplan = c->calledplan; }