[asterisk-commits] rmudgett: branch rmudgett/misdn_facility r166769 - in /team/rmudgett/misdn_fa...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Dec 24 13:20:35 CST 2008


Author: rmudgett
Date: Wed Dec 24 13:20:34 2008
New Revision: 166769

URL: http://svn.digium.com/view/asterisk?view=rev&rev=166769
Log:
Merged from:
https://origsvn.digium.com/svn/asterisk/be/branches/C.2...

..........
r166767 | rmudgett | 2008-12-24 12:36:33 -0600 (Wed, 24 Dec 2008) | 6 lines

JIRA AST-1666/AST-115
*  Fixed handling of received call-deflection facility message.
*  Added call-diversion and Explicit Call Transfer COLP support.
*  Added handling of the NOTIFY message.
*  Added more messages that can handle the facility ie.

Modified:
    team/rmudgett/misdn_facility/channels/chan_misdn.c
    team/rmudgett/misdn_facility/channels/misdn/ie.c
    team/rmudgett/misdn_facility/channels/misdn/isdn_lib.c
    team/rmudgett/misdn_facility/channels/misdn/isdn_lib.h
    team/rmudgett/misdn_facility/channels/misdn/isdn_msg_parser.c

Modified: team/rmudgett/misdn_facility/channels/chan_misdn.c
URL: http://svn.digium.com/view/asterisk/team/rmudgett/misdn_facility/channels/chan_misdn.c?view=diff&rev=166769&r1=166768&r2=166769
==============================================================================
--- team/rmudgett/misdn_facility/channels/chan_misdn.c (original)
+++ team/rmudgett/misdn_facility/channels/chan_misdn.c Wed Dec 24 13:20:34 2008
@@ -649,7 +649,6 @@
 static int pbx_start_chan(struct chan_list *ch);
 
 #define MISDN_ASTERISK_TECH_PVT(ast) ast->tech_pvt
-#define MISDN_ASTERISK_PVT(ast) 1
 
 #include "asterisk/strings.h"
 
@@ -1369,6 +1368,157 @@
 #if defined(AST_MISDN_ENHANCEMENTS)
 /*!
  * \internal
+ * \brief Convert mISDN redirecting reason to diversion reason.
+ *
+ * \param reason mISDN redirecting reason code.
+ *
+ * \return Supported diversion reason code.
+ */
+static unsigned misdn_to_diversion_reason(enum mISDN_REDIRECTING_REASON reason)
+{
+	unsigned diversion_reason;
+
+	switch (reason) {
+	case mISDN_REDIRECTING_REASON_CALL_FWD:
+		diversion_reason = 1;/* cfu */
+		break;
+	case mISDN_REDIRECTING_REASON_CALL_FWD_BUSY:
+		diversion_reason = 2;/* cfb */
+		break;
+	case mISDN_REDIRECTING_REASON_NO_REPLY:
+		diversion_reason = 3;/* cfnr */
+		break;
+	default:
+		diversion_reason = 0;/* unknown */
+		break;
+	}	/* end switch */
+
+	return diversion_reason;
+}	/* end misdn_to_diversion_reason() */
+#endif	/* defined(AST_MISDN_ENHANCEMENTS) */
+
+
+
+
+/* ******************************************************************* */
+#if defined(AST_MISDN_ENHANCEMENTS)
+/*!
+ * \internal
+ * \brief Convert diversion reason to mISDN redirecting reason
+ *
+ * \param diversion_reason Diversion reason to convert
+ *
+ * \return Supported redirecting reason code.
+ */
+static enum mISDN_REDIRECTING_REASON diversion_reason_to_misdn(unsigned diversion_reason)
+{
+	enum mISDN_REDIRECTING_REASON reason;
+
+	switch (diversion_reason) {
+	case 1:/* cfu */
+		reason = mISDN_REDIRECTING_REASON_CALL_FWD;
+		break;
+	case 2:/* cfb */
+		reason = mISDN_REDIRECTING_REASON_CALL_FWD_BUSY;
+		break;
+	case 3:/* cfnr */
+		reason = mISDN_REDIRECTING_REASON_NO_REPLY;
+		break;
+	default:
+		reason = mISDN_REDIRECTING_REASON_UNKNOWN;
+		break;
+	}	/* end switch */
+
+	return reason;
+}	/* end diversion_reason_to_misdn() */
+#endif	/* defined(AST_MISDN_ENHANCEMENTS) */
+
+
+
+
+/* ******************************************************************* */
+#if defined(AST_MISDN_ENHANCEMENTS)
+/*!
+ * \internal
+ * \brief Convert the mISDN presentation to PresentedNumberUnscreened type
+ *
+ * \param presentation mISDN presentation to convert
+ * \param number_present TRUE if the number is present
+ *
+ * \return PresentedNumberUnscreened type
+ */
+static unsigned misdn_to_PresentedNumberUnscreened_type(int presentation, int number_present)
+{
+	unsigned type;
+
+	switch (presentation) {
+	case 0:/* allowed */
+		if (number_present) {
+			type = 0;/* presentationAllowedNumber */
+		} else {
+			type = 2;/* numberNotAvailableDueToInterworking */
+		}
+		break;
+	case 1:/* restricted */
+		if (number_present) {
+			type = 3;/* presentationRestrictedNumber */
+		} else {
+			type = 1;/* presentationRestricted */
+		}
+		break;
+	default:
+		type = 2;/* numberNotAvailableDueToInterworking */
+		break;
+	}	/* end switch */
+
+	return type;
+}	/* end misdn_to_PresentedNumberUnscreened_type() */
+#endif	/* defined(AST_MISDN_ENHANCEMENTS) */
+
+
+
+
+/* ******************************************************************* */
+#if defined(AST_MISDN_ENHANCEMENTS)
+/*!
+ * \internal
+ * \brief Convert the PresentedNumberUnscreened type to mISDN presentation
+ *
+ * \param type PresentedNumberUnscreened type
+ *
+ * \return mISDN presentation
+ */
+static int PresentedNumberUnscreened_to_misdn_pres(unsigned type)
+{
+	int presentation;
+
+	switch (type) {
+	default:
+	case 0:/* presentationAllowedNumber */
+		presentation = 0;/* allowed */
+		break;
+
+	case 1:/* presentationRestricted */
+	case 3:/* presentationRestrictedNumber */
+		presentation = 1;/* restricted */
+		break;
+
+	case 2:/* numberNotAvailableDueToInterworking */
+		presentation = 2;/* unavailable */
+		break;
+	}	/* end switch */
+
+	return presentation;
+}	/* end PresentedNumberUnscreened_to_misdn_pres() */
+#endif	/* defined(AST_MISDN_ENHANCEMENTS) */
+
+
+
+
+/* ******************************************************************* */
+#if defined(AST_MISDN_ENHANCEMENTS)
+/*!
+ * \internal
  * \brief Convert the mISDN numbering plan to PartyNumber numbering plan
  *
  * \param number_plan mISDN numbering plan
@@ -1408,6 +1558,49 @@
 
 	return party_plan;
 }	/* end misdn_to_PartyNumber_plan() */
+#endif	/* defined(AST_MISDN_ENHANCEMENTS) */
+
+
+
+
+/* ******************************************************************* */
+#if defined(AST_MISDN_ENHANCEMENTS)
+/*!
+ * \internal
+ * \brief Convert PartyNumber numbering plan to mISDN numbering plan
+ *
+ * \param party_plan PartyNumber numbering plan
+ *
+ * \return mISDN numbering plan
+ */
+static enum mISDN_NUMBER_PLAN PartyNumber_to_misdn_plan(unsigned party_plan)
+{
+	enum mISDN_NUMBER_PLAN number_plan;
+
+	switch (party_plan) {
+	default:
+	case 0:/* unknown */
+		number_plan = NUMPLAN_UNKNOWN;
+		break;
+	case 1:/* public */
+		number_plan = NUMPLAN_ISDN;
+		break;
+	case 3:/* data */
+		number_plan = NUMPLAN_DATA;
+		break;
+	case 4:/* telex */
+		number_plan = NUMPLAN_TELEX;
+		break;
+	case 8:/* nationalStandard */
+		number_plan = NUMPLAN_NATIONAL;
+		break;
+	case 5:/* private */
+		number_plan = NUMPLAN_PRIVATE;
+		break;
+	}	/* end switch */
+
+	return number_plan;
+}	/* end PartyNumber_to_misdn_plan() */
 #endif	/* defined(AST_MISDN_ENHANCEMENTS) */
 
 
@@ -1465,6 +1658,54 @@
 #if defined(AST_MISDN_ENHANCEMENTS)
 /*!
  * \internal
+ * \brief Convert the PartyNumber public type-of-number to mISDN type-of-number
+ *
+ * \param party_ton PartyNumber public type-of-number
+ *
+ * \return mISDN type-of-number
+ */
+static enum mISDN_NUMBER_TYPE PartyNumber_to_misdn_ton_public(unsigned party_ton)
+{
+	enum mISDN_NUMBER_TYPE ton;
+
+	switch (party_ton) {
+	default:
+	case 0:/* unknown */
+		ton = NUMTYPE_UNKNOWN;
+		break;
+
+	case 1:/* internationalNumber */
+		ton = NUMTYPE_INTERNATIONAL;
+		break;
+
+	case 2:/* nationalNumber */
+		ton = NUMTYPE_NATIONAL;
+		break;
+
+	case 3:/* networkSpecificNumber */
+		ton = NUMTYPE_NETWORK_SPECIFIC;
+		break;
+
+	case 4:/* subscriberNumber */
+		ton = NUMTYPE_SUBSCRIBER;
+		break;
+
+	case 6:/* abbreviatedNumber */
+		ton = NUMTYPE_ABBREVIATED;
+		break;
+	}	/* end switch */
+
+	return ton;
+}	/* end PartyNumber_to_misdn_ton_public() */
+#endif	/* defined(AST_MISDN_ENHANCEMENTS) */
+
+
+
+
+/* ******************************************************************* */
+#if defined(AST_MISDN_ENHANCEMENTS)
+/*!
+ * \internal
  * \brief Convert mISDN type-of-number to PartyNumber private type-of-number
  *
  * \param ton mISDN type-of-number
@@ -1504,6 +1745,54 @@
 
 	return party_ton;
 }	/* end misdn_to_PartyNumber_ton_private() */
+#endif	/* defined(AST_MISDN_ENHANCEMENTS) */
+
+
+
+
+/* ******************************************************************* */
+#if defined(AST_MISDN_ENHANCEMENTS)
+/*!
+ * \internal
+ * \brief Convert the PartyNumber private type-of-number to mISDN type-of-number
+ *
+ * \param party_ton PartyNumber private type-of-number
+ *
+ * \return mISDN type-of-number
+ */
+static enum mISDN_NUMBER_TYPE PartyNumber_to_misdn_ton_private(unsigned party_ton)
+{
+	enum mISDN_NUMBER_TYPE ton;
+
+	switch (party_ton) {
+	default:
+	case 0:/* unknown */
+		ton = NUMTYPE_UNKNOWN;
+		break;
+
+	case 1:/* level2RegionalNumber */
+		ton = NUMTYPE_INTERNATIONAL;
+		break;
+
+	case 2:/* level1RegionalNumber */
+		ton = NUMTYPE_NATIONAL;
+		break;
+
+	case 3:/* pTNSpecificNumber */
+		ton = NUMTYPE_NETWORK_SPECIFIC;
+		break;
+
+	case 4:/* localNumber */
+		ton = NUMTYPE_SUBSCRIBER;
+		break;
+
+	case 6:/* abbreviatedNumber */
+		ton = NUMTYPE_ABBREVIATED;
+		break;
+	}	/* end switch */
+
+	return ton;
+}	/* end PartyNumber_to_misdn_ton_private() */
 #endif	/* defined(AST_MISDN_ENHANCEMENTS) */
 
 
@@ -2164,6 +2453,45 @@
 #if defined(AST_MISDN_ENHANCEMENTS)
 /*!
  * \internal
+ * \brief Extract the information from PartyNumber
+ *
+ * \param id Where to put extracted PartyNumber information
+ * \param party PartyNumber information to extract
+ *
+ * \return Nothing
+ */
+static void misdn_PartyNumber_extract(struct misdn_party_id *id, const struct FacPartyNumber *party)
+{
+	if (party->LengthOfNumber) {
+		ast_copy_string(id->number, (char *) party->Number, sizeof(id->number));
+		id->number_plan = PartyNumber_to_misdn_plan(party->Type);
+		switch (party->Type) {
+		case 1:/* public */
+			id->number_type = PartyNumber_to_misdn_ton_public(party->TypeOfNumber);
+			break;
+		case 5:/* private */
+			id->number_type = PartyNumber_to_misdn_ton_private(party->TypeOfNumber);
+			break;
+		default:
+			id->number_type = NUMTYPE_UNKNOWN;
+			break;
+		}	/* end switch */
+	} else {
+		/* Number not present */
+		id->number_type = NUMTYPE_UNKNOWN;
+		id->number_plan = NUMPLAN_ISDN;
+		id->number[0] = 0;
+	}
+}	/* end misdn_PartyNumber_extract() */
+#endif	/* defined(AST_MISDN_ENHANCEMENTS) */
+
+
+
+
+/* ******************************************************************* */
+#if defined(AST_MISDN_ENHANCEMENTS)
+/*!
+ * \internal
  * \brief Fill in facility Address information
  *
  * \param Address Address structure to fill in.
@@ -2178,6 +2506,49 @@
 	/* Subaddresses are not supported yet */
 	Address->Subaddress.Length = 0;
 }	/* end misdn_Address_fill() */
+#endif	/* defined(AST_MISDN_ENHANCEMENTS) */
+
+
+
+
+/* ******************************************************************* */
+#if defined(AST_MISDN_ENHANCEMENTS)
+/*!
+ * \internal
+ * \brief Fill in facility PresentedNumberUnscreened information
+ *
+ * \param presented PresentedNumberUnscreened structure to fill in.
+ * \param id Information to put in PresentedNumberUnscreened structure.
+ *
+ * \return Nothing
+ */
+static void misdn_PresentedNumberUnscreened_fill(struct FacPresentedNumberUnscreened *presented, const struct misdn_party_id *id)
+{
+	presented->Type = misdn_to_PresentedNumberUnscreened_type(id->presentation, id->number[0] ? 1 : 0);
+	misdn_PartyNumber_fill(&presented->Unscreened, id);
+}	/* end misdn_PresentedNumberUnscreened_fill() */
+#endif	/* defined(AST_MISDN_ENHANCEMENTS) */
+
+
+
+
+/* ******************************************************************* */
+#if defined(AST_MISDN_ENHANCEMENTS)
+/*!
+ * \internal
+ * \brief Extract the information from PartyNumber
+ *
+ * \param id Where to put extracted PresentedNumberUnscreened information
+ * \param presented PresentedNumberUnscreened information to extract
+ *
+ * \return Nothing
+ */
+static void misdn_PresentedNumberUnscreened_extract(struct misdn_party_id *id, const struct FacPresentedNumberUnscreened *presented)
+{
+	id->presentation = PresentedNumberUnscreened_to_misdn_pres(presented->Type);
+	id->screening = 0;/* unscreened */
+	misdn_PartyNumber_extract(id, &presented->Unscreened);
+}	/* end misdn_PresentedNumberUnscreened_extract() */
 #endif	/* defined(AST_MISDN_ENHANCEMENTS) */
 
 
@@ -2284,6 +2655,86 @@
 
 /* ******************************************************************* */
 #if defined(AST_MISDN_ENHANCEMENTS)
+static void print_facility_PresentedNumberUnscreened(unsigned Level, const struct FacPresentedNumberUnscreened *Presented, const struct misdn_bchannel *bc)
+{
+	const char *Spacing;
+
+	Spacing = &Level_Spacing[sizeof(Level_Spacing) - 1 - Level];
+	chan_misdn_log(1, bc->port, " -->%s Unscreened Type:%d\n", Spacing, Presented->Type);
+	switch (Presented->Type) {
+	case 0: /* presentationAllowedNumber */
+		chan_misdn_log(1, bc->port, " -->%s  Allowed:\n", Spacing);
+		print_facility_PartyNumber(Level + 2, &Presented->Unscreened, bc);
+		break;
+	case 1: /* presentationRestricted */
+		chan_misdn_log(1, bc->port, " -->%s  Restricted\n", Spacing);
+		break;
+	case 2: /* numberNotAvailableDueToInterworking */
+		chan_misdn_log(1, bc->port, " -->%s  Not Available\n", Spacing);
+		break;
+	case 3: /* presentationRestrictedNumber */
+		chan_misdn_log(1, bc->port, " -->%s  Restricted:\n", Spacing);
+		print_facility_PartyNumber(Level + 2, &Presented->Unscreened, bc);
+		break;
+	default:
+		break;
+	}	/* end switch */
+}	/* end print_facility_PresentedNumberUnscreened() */
+#endif	/* defined(AST_MISDN_ENHANCEMENTS) */
+
+
+
+
+/* ******************************************************************* */
+#if defined(AST_MISDN_ENHANCEMENTS)
+static void print_facility_AddressScreened(unsigned Level, const struct FacAddressScreened *Address, const struct misdn_bchannel *bc)
+{
+	const char *Spacing;
+
+	Spacing = &Level_Spacing[sizeof(Level_Spacing) - 1 - Level];
+	chan_misdn_log(1, bc->port, " -->%s ScreeningIndicator:%d\n", Spacing, Address->ScreeningIndicator);
+	print_facility_PartyNumber(Level, &Address->Party, bc);
+	print_facility_Subaddress(Level, &Address->Subaddress, bc);
+}	/* end print_facility_AddressScreened() */
+#endif	/* defined(AST_MISDN_ENHANCEMENTS) */
+
+
+
+
+/* ******************************************************************* */
+#if defined(AST_MISDN_ENHANCEMENTS)
+static void print_facility_PresentedAddressScreened(unsigned Level, const struct FacPresentedAddressScreened *Presented, const struct misdn_bchannel *bc)
+{
+	const char *Spacing;
+
+	Spacing = &Level_Spacing[sizeof(Level_Spacing) - 1 - Level];
+	chan_misdn_log(1, bc->port, " -->%s Screened Type:%d\n", Spacing, Presented->Type);
+	switch (Presented->Type) {
+	case 0: /* presentationAllowedAddress */
+		chan_misdn_log(1, bc->port, " -->%s  Allowed:\n", Spacing);
+		print_facility_AddressScreened(Level + 2, &Presented->Address, bc);
+		break;
+	case 1: /* presentationRestricted */
+		chan_misdn_log(1, bc->port, " -->%s  Restricted\n", Spacing);
+		break;
+	case 2: /* numberNotAvailableDueToInterworking */
+		chan_misdn_log(1, bc->port, " -->%s  Not Available\n", Spacing);
+		break;
+	case 3: /* presentationRestrictedAddress */
+		chan_misdn_log(1, bc->port, " -->%s  Restricted:\n", Spacing);
+		print_facility_AddressScreened(Level + 2, &Presented->Address, bc);
+		break;
+	default:
+		break;
+	}	/* end switch */
+}	/* end print_facility_PresentedAddressScreened() */
+#endif	/* defined(AST_MISDN_ENHANCEMENTS) */
+
+
+
+
+/* ******************************************************************* */
+#if defined(AST_MISDN_ENHANCEMENTS)
 static void print_facility_Q931_Bc_Hlc_Llc(unsigned Level, const struct Q931_Bc_Hlc_Llc *Q931ie, const struct misdn_bchannel *bc)
 {
 	const char *Spacing;
@@ -2300,6 +2751,32 @@
 		chan_misdn_log(1, bc->port, " -->%s  Llc Len:%d\n", Spacing, Q931ie->Llc.Length);
 	}
 }	/* end print_facility_Q931_Bc_Hlc_Llc() */
+#endif	/* defined(AST_MISDN_ENHANCEMENTS) */
+
+
+
+
+/* ******************************************************************* */
+#if defined(AST_MISDN_ENHANCEMENTS)
+static void print_facility_Q931_Bc_Hlc_Llc_Uu(unsigned Level, const struct Q931_Bc_Hlc_Llc_Uu *Q931ie, const struct misdn_bchannel *bc)
+{
+	const char *Spacing;
+
+	Spacing = &Level_Spacing[sizeof(Level_Spacing) - 1 - Level];
+	chan_misdn_log(1, bc->port, " -->%s Q931ie:\n", Spacing);
+	if (Q931ie->Bc.Length) {
+		chan_misdn_log(1, bc->port, " -->%s  Bc Len:%d\n", Spacing, Q931ie->Bc.Length);
+	}
+	if (Q931ie->Hlc.Length) {
+		chan_misdn_log(1, bc->port, " -->%s  Hlc Len:%d\n", Spacing, Q931ie->Hlc.Length);
+	}
+	if (Q931ie->Llc.Length) {
+		chan_misdn_log(1, bc->port, " -->%s  Llc Len:%d\n", Spacing, Q931ie->Llc.Length);
+	}
+	if (Q931ie->UserInfo.Length) {
+		chan_misdn_log(1, bc->port, " -->%s  UserInfo Len:%d\n", Spacing, Q931ie->UserInfo.Length);
+	}
+}	/* end print_facility_Q931_Bc_Hlc_Llc_Uu() */
 #endif	/* defined(AST_MISDN_ENHANCEMENTS) */
 
 
@@ -2325,6 +2802,47 @@
 #endif	/* defined(AST_MISDN_ENHANCEMENTS) */
 
 
+
+
+/* ******************************************************************* */
+#if defined(AST_MISDN_ENHANCEMENTS)
+static void print_facility_ServedUserNr(unsigned Level, const struct FacPartyNumber *Party, const struct misdn_bchannel *bc)
+{
+	const char *Spacing;
+
+	Spacing = &Level_Spacing[sizeof(Level_Spacing) - 1 - Level];
+	if (Party->LengthOfNumber) {
+		print_facility_PartyNumber(Level, Party, bc);
+	} else {
+		chan_misdn_log(1, bc->port, " -->%s All Numbers\n", Spacing);
+	}
+}	/* end print_facility_ServedUserNr() */
+#endif	/* defined(AST_MISDN_ENHANCEMENTS) */
+
+
+
+
+/* ******************************************************************* */
+#if defined(AST_MISDN_ENHANCEMENTS)
+static void print_facility_IntResult(unsigned Level, const struct FacForwardingRecord *ForwardingRecord, const struct misdn_bchannel *bc)
+{
+	const char *Spacing;
+
+	Spacing = &Level_Spacing[sizeof(Level_Spacing) - 1 - Level];
+	chan_misdn_log(1, bc->port, " -->%s Procedure:%d BasicService:%d\n",
+		Spacing,
+		ForwardingRecord->Procedure,
+		ForwardingRecord->BasicService);
+	chan_misdn_log(1, bc->port, " -->%s ForwardedTo:\n", Spacing);
+	print_facility_Address(Level + 1, &ForwardingRecord->ForwardedTo, bc);
+	chan_misdn_log(1, bc->port, " -->%s ServedUserNr:\n", Spacing);
+	print_facility_ServedUserNr(Level + 1, &ForwardingRecord->ServedUser, bc);
+}	/* end print_facility_IntResult() */
+#endif	/* defined(AST_MISDN_ENHANCEMENTS) */
+
+
+
+
 static void print_facility(const struct FacParm *fac, const const struct misdn_bchannel *bc)
 {
 #if defined(AST_MISDN_ENHANCEMENTS)
@@ -2332,10 +2850,219 @@
 #endif	/* defined(AST_MISDN_ENHANCEMENTS) */
 
 	switch (fac->Function) {
+#if defined(AST_MISDN_ENHANCEMENTS)
+	case Fac_ActivationDiversion:
+		chan_misdn_log(1, bc->port, " --> ActivationDiversion: InvokeID:%d\n",
+			fac->u.ActivationDiversion.InvokeID);
+		switch (fac->u.ActivationDiversion.ComponentType) {
+		case FacComponent_Invoke:
+			chan_misdn_log(1, bc->port, " -->  Invoke: Procedure:%d BasicService:%d\n",
+				fac->u.ActivationDiversion.Component.Invoke.Procedure,
+				fac->u.ActivationDiversion.Component.Invoke.BasicService);
+			chan_misdn_log(1, bc->port, " -->   ForwardedTo:\n");
+			print_facility_Address(3, &fac->u.ActivationDiversion.Component.Invoke.ForwardedTo, bc);
+			chan_misdn_log(1, bc->port, " -->   ServedUserNr:\n");
+			print_facility_ServedUserNr(3, &fac->u.ActivationDiversion.Component.Invoke.ServedUser, bc);
+			break;
+		case FacComponent_Result:
+			chan_misdn_log(1, bc->port, " -->  Result\n");
+			break;
+		default:
+			break;
+		}	/* end switch */
+		break;
+	case Fac_DeactivationDiversion:
+		chan_misdn_log(1, bc->port, " --> DeactivationDiversion: InvokeID:%d\n",
+			fac->u.DeactivationDiversion.InvokeID);
+		switch (fac->u.DeactivationDiversion.ComponentType) {
+		case FacComponent_Invoke:
+			chan_misdn_log(1, bc->port, " -->  Invoke: Procedure:%d BasicService:%d\n",
+				fac->u.DeactivationDiversion.Component.Invoke.Procedure,
+				fac->u.DeactivationDiversion.Component.Invoke.BasicService);
+			chan_misdn_log(1, bc->port, " -->   ServedUserNr:\n");
+			print_facility_ServedUserNr(3, &fac->u.DeactivationDiversion.Component.Invoke.ServedUser, bc);
+			break;
+		case FacComponent_Result:
+			chan_misdn_log(1, bc->port, " -->  Result\n");
+			break;
+		default:
+			break;
+		}	/* end switch */
+		break;
+	case Fac_ActivationStatusNotificationDiv:
+		chan_misdn_log(1, bc->port, " --> ActivationStatusNotificationDiv: InvokeID:%d Procedure:%d BasicService:%d\n",
+			fac->u.ActivationStatusNotificationDiv.InvokeID,
+			fac->u.ActivationStatusNotificationDiv.Procedure,
+			fac->u.ActivationStatusNotificationDiv.BasicService);
+		chan_misdn_log(1, bc->port, " -->  ForwardedTo:\n");
+		print_facility_Address(2, &fac->u.ActivationStatusNotificationDiv.ForwardedTo, bc);
+		chan_misdn_log(1, bc->port, " -->  ServedUserNr:\n");
+		print_facility_ServedUserNr(2, &fac->u.ActivationStatusNotificationDiv.ServedUser, bc);
+		break;
+	case Fac_DeactivationStatusNotificationDiv:
+		chan_misdn_log(1, bc->port, " --> DeactivationStatusNotificationDiv: InvokeID:%d Procedure:%d BasicService:%d\n",
+			fac->u.DeactivationStatusNotificationDiv.InvokeID,
+			fac->u.DeactivationStatusNotificationDiv.Procedure,
+			fac->u.DeactivationStatusNotificationDiv.BasicService);
+		chan_misdn_log(1, bc->port, " -->  ServedUserNr:\n");
+		print_facility_ServedUserNr(2, &fac->u.DeactivationStatusNotificationDiv.ServedUser, bc);
+		break;
+	case Fac_InterrogationDiversion:
+		chan_misdn_log(1, bc->port, " --> InterrogationDiversion: InvokeID:%d\n",
+			fac->u.InterrogationDiversion.InvokeID);
+		switch (fac->u.InterrogationDiversion.ComponentType) {
+		case FacComponent_Invoke:
+			chan_misdn_log(1, bc->port, " -->  Invoke: Procedure:%d BasicService:%d\n",
+				fac->u.InterrogationDiversion.Component.Invoke.Procedure,
+				fac->u.InterrogationDiversion.Component.Invoke.BasicService);
+			chan_misdn_log(1, bc->port, " -->   ServedUserNr:\n");
+			print_facility_ServedUserNr(3, &fac->u.InterrogationDiversion.Component.Invoke.ServedUser, bc);
+			break;
+		case FacComponent_Result:
+			chan_misdn_log(1, bc->port, " -->  Result:\n");
+			if (fac->u.InterrogationDiversion.Component.Result.NumRecords) {
+				for (Index = 0; Index < fac->u.InterrogationDiversion.Component.Result.NumRecords; ++Index) {
+					chan_misdn_log(1, bc->port, " -->   IntResult[%d]:\n", Index);
+					print_facility_IntResult(3, &fac->u.InterrogationDiversion.Component.Result.List[Index], bc);
+				}	/* end for */
+			}
+			break;
+		default:
+			break;
+		}	/* end switch */
+		break;
+	case Fac_DiversionInformation:
+		chan_misdn_log(1, bc->port, " --> DiversionInformation: InvokeID:%d Reason:%d BasicService:%d\n",
+			fac->u.DiversionInformation.InvokeID,
+			fac->u.DiversionInformation.DiversionReason,
+			fac->u.DiversionInformation.BasicService);
+		if (fac->u.DiversionInformation.ServedUserSubaddress.Length) {
+			chan_misdn_log(1, bc->port, " -->  ServedUserSubaddress:\n");
+			print_facility_Subaddress(2, &fac->u.DiversionInformation.ServedUserSubaddress, bc);
+		}
+		if (fac->u.DiversionInformation.CallingAddressPresent) {
+			chan_misdn_log(1, bc->port, " -->  CallingAddress:\n");
+			print_facility_PresentedAddressScreened(2, &fac->u.DiversionInformation.CallingAddress, bc);
+		}
+		if (fac->u.DiversionInformation.OriginalCalledPresent) {
+			chan_misdn_log(1, bc->port, " -->  OriginalCalledNr:\n");
+			print_facility_PresentedNumberUnscreened(2, &fac->u.DiversionInformation.OriginalCalled, bc);
+		}
+		if (fac->u.DiversionInformation.LastDivertingPresent) {
+			chan_misdn_log(1, bc->port, " -->  LastDivertingNr:\n");
+			print_facility_PresentedNumberUnscreened(2, &fac->u.DiversionInformation.LastDiverting, bc);
+		}
+		if (fac->u.DiversionInformation.LastDivertingReasonPresent) {
+			chan_misdn_log(1, bc->port, " -->  LastDivertingReason:%d\n", fac->u.DiversionInformation.LastDivertingReason);
+		}
+		if (fac->u.DiversionInformation.UserInfo.Length) {
+			chan_misdn_log(1, bc->port, " -->  UserInfo Length:%d\n", fac->u.DiversionInformation.UserInfo.Length);
+		}
+		break;
+	case Fac_CallDeflection:
+		chan_misdn_log(1, bc->port, " --> CallDeflection: InvokeID:%d\n",
+			fac->u.CallDeflection.InvokeID);
+		switch (fac->u.CallDeflection.ComponentType) {
+		case FacComponent_Invoke:
+			chan_misdn_log(1, bc->port, " -->  Invoke:\n");
+			if (fac->u.CallDeflection.Component.Invoke.PresentationAllowedToDivertedToUserPresent) {
+				chan_misdn_log(1, bc->port, " -->   PresentationAllowed:%d\n",
+					fac->u.CallDeflection.Component.Invoke.PresentationAllowedToDivertedToUser);
+			}
+			chan_misdn_log(1, bc->port, " -->   DeflectionAddress:\n");
+			print_facility_Address(3, &fac->u.CallDeflection.Component.Invoke.Deflection, bc);
+			break;
+		case FacComponent_Result:
+			chan_misdn_log(1, bc->port, " -->  Result\n");
+			break;
+		default:
+			break;
+		}	/* end switch */
+		break;
+	case Fac_CallRerouteing:
+		chan_misdn_log(1, bc->port, " --> CallRerouteing: InvokeID:%d\n",
+			fac->u.CallRerouteing.InvokeID);
+		switch (fac->u.CallRerouteing.ComponentType) {
+		case FacComponent_Invoke:
+			chan_misdn_log(1, bc->port, " -->  Invoke: Reason:%d Counter:%d\n",
+				fac->u.CallRerouteing.Component.Invoke.ReroutingReason,
+				fac->u.CallRerouteing.Component.Invoke.ReroutingCounter);
+			chan_misdn_log(1, bc->port, " -->   CalledAddress:\n");
+			print_facility_Address(3, &fac->u.CallRerouteing.Component.Invoke.CalledAddress, bc);
+			print_facility_Q931_Bc_Hlc_Llc_Uu(2, &fac->u.CallRerouteing.Component.Invoke.Q931ie, bc);
+			chan_misdn_log(1, bc->port, " -->   LastReroutingNr:\n");
+			print_facility_PresentedNumberUnscreened(3, &fac->u.CallRerouteing.Component.Invoke.LastRerouting, bc);
+			chan_misdn_log(1, bc->port, " -->   SubscriptionOption:%d\n",
+				fac->u.CallRerouteing.Component.Invoke.SubscriptionOption);
+			if (fac->u.CallRerouteing.Component.Invoke.CallingPartySubaddress.Length) {
+				chan_misdn_log(1, bc->port, " -->   CallingParty:\n");
+				print_facility_Subaddress(3, &fac->u.CallRerouteing.Component.Invoke.CallingPartySubaddress, bc);
+			}
+			break;
+		case FacComponent_Result:
+			chan_misdn_log(1, bc->port, " -->  Result\n");
+			break;
+		default:
+			break;
+		}	/* end switch */
+		break;
+	case Fac_InterrogateServedUserNumbers:
+		chan_misdn_log(1, bc->port, " --> InterrogateServedUserNumbers: InvokeID:%d\n",
+			fac->u.InterrogateServedUserNumbers.InvokeID);
+		switch (fac->u.InterrogateServedUserNumbers.ComponentType) {
+		case FacComponent_Invoke:
+			chan_misdn_log(1, bc->port, " -->  Invoke\n");
+			break;
+		case FacComponent_Result:
+			chan_misdn_log(1, bc->port, " -->  Result:\n");
+			if (fac->u.InterrogateServedUserNumbers.Component.Result.NumRecords) {
+				for (Index = 0; Index < fac->u.InterrogateServedUserNumbers.Component.Result.NumRecords; ++Index) {
+					chan_misdn_log(1, bc->port, " -->   ServedUserNr[%d]:\n", Index);
+					print_facility_PartyNumber(3, &fac->u.InterrogateServedUserNumbers.Component.Result.List[Index], bc);
+				}	/* end for */
+			}
+			break;
+		default:
+			break;
+		}	/* end switch */
+		break;
+	case Fac_DivertingLegInformation1:
+		chan_misdn_log(1, bc->port, " --> DivertingLegInformation1: InvokeID:%d Reason:%d SubscriptionOption:%d\n",
+			fac->u.DivertingLegInformation1.InvokeID,
+			fac->u.DivertingLegInformation1.DiversionReason,
+			fac->u.DivertingLegInformation1.SubscriptionOption);
+		if (fac->u.DivertingLegInformation1.DivertedToPresent) {
+			chan_misdn_log(1, bc->port, " -->  DivertedToNr:\n");
+			print_facility_PresentedNumberUnscreened(2, &fac->u.DivertingLegInformation1.DivertedTo, bc);
+		}
+		break;
+	case Fac_DivertingLegInformation2:
+		chan_misdn_log(1, bc->port, " --> DivertingLegInformation2: InvokeID:%d Reason:%d Count:%d\n",
+			fac->u.DivertingLegInformation2.InvokeID,
+			fac->u.DivertingLegInformation2.DiversionReason,
+			fac->u.DivertingLegInformation2.DiversionCounter);
+		if (fac->u.DivertingLegInformation2.DivertingPresent) {
+			chan_misdn_log(1, bc->port, " -->  DivertingNr:\n");
+			print_facility_PresentedNumberUnscreened(2, &fac->u.DivertingLegInformation2.Diverting, bc);
+		}
+		if (fac->u.DivertingLegInformation2.OriginalCalledPresent) {
+			chan_misdn_log(1, bc->port, " -->  OriginalCalledNr:\n");
+			print_facility_PresentedNumberUnscreened(2, &fac->u.DivertingLegInformation2.OriginalCalled, bc);
+		}
+		break;
+	case Fac_DivertingLegInformation3:
+		chan_misdn_log(1, bc->port, " --> DivertingLegInformation3: InvokeID:%d PresentationAllowed:%d\n",
+			fac->u.DivertingLegInformation3.InvokeID,
+			fac->u.DivertingLegInformation3.PresentationAllowedIndicator);
+		break;
+
+#else	/* !defined(AST_MISDN_ENHANCEMENTS) */
+
 	case Fac_CD:
 		chan_misdn_log(1,bc->port," --> calldeflect to: %s, presentable: %s\n", fac->u.CDeflection.DeflectedToNumber,
 			fac->u.CDeflection.PresentationAllowed ? "yes" : "no");
 		break;
+#endif	/* !defined(AST_MISDN_ENHANCEMENTS) */
 	case Fac_AOCDCurrency:
 		if (fac->u.AOCDcur.chargeNotAvailable)
 			chan_misdn_log(1,bc->port," --> AOCD currency: charge not available\n");
@@ -2379,6 +3106,64 @@
 			chan_misdn_log(1, bc->port, " --> REJECT: Code:0x%02x\n",
 				fac->u.REJECT.Code);
 		}
+		break;
+	case Fac_EctExecute:
+		chan_misdn_log(1, bc->port, " --> EctExecute: InvokeID:%d\n",
+			fac->u.EctExecute.InvokeID);
+		break;
+	case Fac_ExplicitEctExecute:
+		chan_misdn_log(1, bc->port, " --> ExplicitEctExecute: InvokeID:%d LinkID:%d\n",
+			fac->u.ExplicitEctExecute.InvokeID,
+			fac->u.ExplicitEctExecute.LinkID);
+		break;
+	case Fac_RequestSubaddress:
+		chan_misdn_log(1, bc->port, " --> RequestSubaddress: InvokeID:%d\n",
+			fac->u.RequestSubaddress.InvokeID);
+		break;
+	case Fac_SubaddressTransfer:
+		chan_misdn_log(1, bc->port, " --> SubaddressTransfer: InvokeID:%d\n",
+			fac->u.SubaddressTransfer.InvokeID);
+		print_facility_Subaddress(1, &fac->u.SubaddressTransfer.Subaddress, bc);
+		break;
+	case Fac_EctLinkIdRequest:
+		chan_misdn_log(1, bc->port, " --> EctLinkIdRequest: InvokeID:%d\n",
+			fac->u.EctLinkIdRequest.InvokeID);
+		switch (fac->u.EctLinkIdRequest.ComponentType) {
+		case FacComponent_Invoke:
+			chan_misdn_log(1, bc->port, " -->  Invoke\n");
+			break;
+		case FacComponent_Result:
+			chan_misdn_log(1, bc->port, " -->  Result: LinkID:%d\n",
+				fac->u.EctLinkIdRequest.Component.Result.LinkID);
+			break;
+		default:
+			break;
+		}	/* end switch */
+		break;
+	case Fac_EctInform:
+		chan_misdn_log(1, bc->port, " --> EctInform: InvokeID:%d Status:%d\n",
+			fac->u.EctInform.InvokeID,
+			fac->u.EctInform.Status);
+		if (fac->u.EctInform.RedirectionPresent) {
+			chan_misdn_log(1, bc->port, " -->  Redirection Number\n");
+			print_facility_PresentedNumberUnscreened(2, &fac->u.EctInform.Redirection, bc);
+		}
+		break;
+	case Fac_EctLoopTest:
+		chan_misdn_log(1, bc->port, " --> EctLoopTest: InvokeID:%d\n",
+			fac->u.EctLoopTest.InvokeID);
+		switch (fac->u.EctLoopTest.ComponentType) {
+		case FacComponent_Invoke:
+			chan_misdn_log(1, bc->port, " -->  Invoke: CallTransferID:%d\n",
+				fac->u.EctLoopTest.Component.Invoke.CallTransferID);
+			break;
+		case FacComponent_Result:
+			chan_misdn_log(1, bc->port, " -->  Result: LoopResult:%d\n",
+				fac->u.EctLoopTest.Component.Result.LoopResult);
+			break;
+		default:
+			break;
+		}	/* end switch */
 		break;
 	case Fac_StatusRequest:
 		chan_misdn_log(1, bc->port, " --> StatusRequest: InvokeID:%d\n",
@@ -3382,7 +4167,8 @@
 	ast_cli(fd,
 		"* Pid:%d Port:%d Ch:%d Mode:%s Orig:%s dialed:%s\n"
 		"  --> caller:\"%s\" <%s>\n"
-		"  --> redirecting:\"%s\" <%s>\n"
+		"  --> redirecting-from:\"%s\" <%s>\n"
+		"  --> redirecting-to:\"%s\" <%s>\n"
 		"  --> context:%s state:%s\n",
 		bc->pid,
 		bc->port,
@@ -3394,6 +4180,8 @@
 		(ast && ast->cid.cid_num) ? ast->cid.cid_num : "",
 		bc->redirecting.from.name,
 		bc->redirecting.from.number,
+		bc->redirecting.to.name,
+		bc->redirecting.to.number,
 		ast ? ast->context : "",
 		misdn_get_ch_state(help));
 	if (misdn_debug[bc->port] > 0) {
@@ -4026,6 +4814,348 @@
 	[50].u.CCNR_T_Request.InvokeID = 53,
 	[50].u.CCNR_T_Request.ComponentType = FacComponent_Result,
 	[50].u.CCNR_T_Request.Component.Result.RetentionSupported = 1,
+
+	[51].Function = Fac_EctExecute,
+	[51].u.EctExecute.InvokeID = 54,
+
+	[52].Function = Fac_ExplicitEctExecute,
+	[52].u.ExplicitEctExecute.InvokeID = 55,
+	[52].u.ExplicitEctExecute.LinkID = 23,
+
+	[53].Function = Fac_RequestSubaddress,
+	[53].u.RequestSubaddress.InvokeID = 56,
+
+	[54].Function = Fac_SubaddressTransfer,
+	[54].u.SubaddressTransfer.InvokeID = 57,
+	[54].u.SubaddressTransfer.Subaddress.Type = 1,
+	[54].u.SubaddressTransfer.Subaddress.Length = 4,
+	[54].u.SubaddressTransfer.Subaddress.u.Nsap = "6492",
+
+	[55].Function = Fac_EctLinkIdRequest,
+	[55].u.EctLinkIdRequest.InvokeID = 58,
+	[55].u.EctLinkIdRequest.ComponentType = FacComponent_Invoke,
+
+	[56].Function = Fac_EctLinkIdRequest,
+	[56].u.EctLinkIdRequest.InvokeID = 59,
+	[56].u.EctLinkIdRequest.ComponentType = FacComponent_Result,
+	[56].u.EctLinkIdRequest.Component.Result.LinkID = 76,
+
+	[57].Function = Fac_EctInform,
+	[57].u.EctInform.InvokeID = 60,
+	[57].u.EctInform.Status = 1,
+	[57].u.EctInform.RedirectionPresent = 1,
+	[57].u.EctInform.Redirection.Type = 0,
+	[57].u.EctInform.Redirection.Unscreened.Type = 8,
+	[57].u.EctInform.Redirection.Unscreened.LengthOfNumber = 4,
+	[57].u.EctInform.Redirection.Unscreened.Number = "6229",
+
+	[58].Function = Fac_EctInform,
+	[58].u.EctInform.InvokeID = 61,
+	[58].u.EctInform.Status = 1,
+	[58].u.EctInform.RedirectionPresent = 1,
+	[58].u.EctInform.Redirection.Type = 1,
+
+	[59].Function = Fac_EctInform,
+	[59].u.EctInform.InvokeID = 62,
+	[59].u.EctInform.Status = 1,
+	[59].u.EctInform.RedirectionPresent = 1,
+	[59].u.EctInform.Redirection.Type = 2,
+
+	[60].Function = Fac_EctInform,
+	[60].u.EctInform.InvokeID = 63,
+	[60].u.EctInform.Status = 1,
+	[60].u.EctInform.RedirectionPresent = 1,
+	[60].u.EctInform.Redirection.Type = 3,
+	[60].u.EctInform.Redirection.Unscreened.Type = 8,
+	[60].u.EctInform.Redirection.Unscreened.LengthOfNumber = 4,
+	[60].u.EctInform.Redirection.Unscreened.Number = "3340",
+
+	[61].Function = Fac_EctInform,
+	[61].u.EctInform.InvokeID = 64,
+	[61].u.EctInform.Status = 1,
+	[61].u.EctInform.RedirectionPresent = 0,
+
+	[62].Function = Fac_EctLoopTest,
+	[62].u.EctLoopTest.InvokeID = 65,
+	[62].u.EctLoopTest.ComponentType = FacComponent_Invoke,
+	[62].u.EctLoopTest.Component.Invoke.CallTransferID = 7,
+
+	[63].Function = Fac_EctLoopTest,
+	[63].u.EctLoopTest.InvokeID = 66,
+	[63].u.EctLoopTest.ComponentType = FacComponent_Result,
+	[63].u.EctLoopTest.Component.Result.LoopResult = 2,
+
+	[64].Function = Fac_ActivationDiversion,
+	[64].u.ActivationDiversion.InvokeID = 67,
+	[64].u.ActivationDiversion.ComponentType = FacComponent_Invoke,
+	[64].u.ActivationDiversion.Component.Invoke.Procedure = 2,
+	[64].u.ActivationDiversion.Component.Invoke.BasicService = 3,
+	[64].u.ActivationDiversion.Component.Invoke.ForwardedTo.Party.Type = 4,
+	[64].u.ActivationDiversion.Component.Invoke.ForwardedTo.Party.LengthOfNumber = 4,
+	[64].u.ActivationDiversion.Component.Invoke.ForwardedTo.Party.Number = "1803",
+	[64].u.ActivationDiversion.Component.Invoke.ServedUser.Type = 4,
+	[64].u.ActivationDiversion.Component.Invoke.ServedUser.LengthOfNumber = 4,
+	[64].u.ActivationDiversion.Component.Invoke.ServedUser.Number = "5398",
+
+	[65].Function = Fac_ActivationDiversion,
+	[65].u.ActivationDiversion.InvokeID = 68,
+	[65].u.ActivationDiversion.ComponentType = FacComponent_Invoke,
+	[65].u.ActivationDiversion.Component.Invoke.Procedure = 1,
+	[65].u.ActivationDiversion.Component.Invoke.BasicService = 5,
+	[65].u.ActivationDiversion.Component.Invoke.ForwardedTo.Party.Type = 4,
+	[65].u.ActivationDiversion.Component.Invoke.ForwardedTo.Party.LengthOfNumber = 4,
+	[65].u.ActivationDiversion.Component.Invoke.ForwardedTo.Party.Number = "1803",
+
+	[66].Function = Fac_ActivationDiversion,
+	[66].u.ActivationDiversion.InvokeID = 69,
+	[66].u.ActivationDiversion.ComponentType = FacComponent_Result,
+
+	[67].Function = Fac_DeactivationDiversion,
+	[67].u.DeactivationDiversion.InvokeID = 70,
+	[67].u.DeactivationDiversion.ComponentType = FacComponent_Invoke,
+	[67].u.DeactivationDiversion.Component.Invoke.Procedure = 1,
+	[67].u.DeactivationDiversion.Component.Invoke.BasicService = 5,
+
+	[68].Function = Fac_DeactivationDiversion,
+	[68].u.DeactivationDiversion.InvokeID = 71,
+	[68].u.DeactivationDiversion.ComponentType = FacComponent_Result,
+
+	[69].Function = Fac_ActivationStatusNotificationDiv,
+	[69].u.ActivationStatusNotificationDiv.InvokeID = 72,
+	[69].u.ActivationStatusNotificationDiv.Procedure = 1,
+	[69].u.ActivationStatusNotificationDiv.BasicService = 5,
+	[69].u.ActivationStatusNotificationDiv.ForwardedTo.Party.Type = 4,
+	[69].u.ActivationStatusNotificationDiv.ForwardedTo.Party.LengthOfNumber = 4,
+	[69].u.ActivationStatusNotificationDiv.ForwardedTo.Party.Number = "1803",
+
+	[70].Function = Fac_DeactivationStatusNotificationDiv,
+	[70].u.DeactivationStatusNotificationDiv.InvokeID = 73,
+	[70].u.DeactivationStatusNotificationDiv.Procedure = 1,
+	[70].u.DeactivationStatusNotificationDiv.BasicService = 5,
+
+	[71].Function = Fac_InterrogationDiversion,
+	[71].u.InterrogationDiversion.InvokeID = 74,
+	[71].u.InterrogationDiversion.ComponentType = FacComponent_Invoke,
+	[71].u.InterrogationDiversion.Component.Invoke.Procedure = 1,
+	[71].u.InterrogationDiversion.Component.Invoke.BasicService = 5,
+
+	[72].Function = Fac_InterrogationDiversion,
+	[72].u.InterrogationDiversion.InvokeID = 75,
+	[72].u.InterrogationDiversion.ComponentType = FacComponent_Invoke,
+	[72].u.InterrogationDiversion.Component.Invoke.Procedure = 1,
+
+	[73].Function = Fac_InterrogationDiversion,
+	[73].u.InterrogationDiversion.InvokeID = 76,
+	[73].u.InterrogationDiversion.ComponentType = FacComponent_Result,
+	[73].u.InterrogationDiversion.Component.Result.NumRecords = 2,
+	[73].u.InterrogationDiversion.Component.Result.List[0].Procedure = 2,
+	[73].u.InterrogationDiversion.Component.Result.List[0].BasicService = 5,
+	[73].u.InterrogationDiversion.Component.Result.List[0].ForwardedTo.Party.Type = 4,
+	[73].u.InterrogationDiversion.Component.Result.List[0].ForwardedTo.Party.LengthOfNumber = 4,
+	[73].u.InterrogationDiversion.Component.Result.List[0].ForwardedTo.Party.Number = "1803",
+	[73].u.InterrogationDiversion.Component.Result.List[1].Procedure = 1,
+	[73].u.InterrogationDiversion.Component.Result.List[1].BasicService = 3,
+	[73].u.InterrogationDiversion.Component.Result.List[1].ForwardedTo.Party.Type = 4,
+	[73].u.InterrogationDiversion.Component.Result.List[1].ForwardedTo.Party.LengthOfNumber = 4,
+	[73].u.InterrogationDiversion.Component.Result.List[1].ForwardedTo.Party.Number = "1903",
+	[73].u.InterrogationDiversion.Component.Result.List[1].ServedUser.Type = 4,
+	[73].u.InterrogationDiversion.Component.Result.List[1].ServedUser.LengthOfNumber = 4,
+	[73].u.InterrogationDiversion.Component.Result.List[1].ServedUser.Number = "5398",
+
+	[74].Function = Fac_DiversionInformation,
+	[74].u.DiversionInformation.InvokeID = 77,
+	[74].u.DiversionInformation.DiversionReason = 3,
+	[74].u.DiversionInformation.BasicService = 5,
+	[74].u.DiversionInformation.ServedUserSubaddress.Type = 1,
+	[74].u.DiversionInformation.ServedUserSubaddress.Length = 4,
+	[74].u.DiversionInformation.ServedUserSubaddress.u.Nsap = "6492",
+	[74].u.DiversionInformation.CallingAddressPresent = 1,
+	[74].u.DiversionInformation.CallingAddress.Type = 0,
+	[74].u.DiversionInformation.CallingAddress.Address.ScreeningIndicator = 3,
+	[74].u.DiversionInformation.CallingAddress.Address.Party.Type = 4,
+	[74].u.DiversionInformation.CallingAddress.Address.Party.LengthOfNumber = 4,
+	[74].u.DiversionInformation.CallingAddress.Address.Party.Number = "1803",
+	[74].u.DiversionInformation.OriginalCalledPresent = 1,
+	[74].u.DiversionInformation.OriginalCalled.Type = 1,
+	[74].u.DiversionInformation.LastDivertingPresent = 1,

[... 1553 lines stripped ...]



More information about the asterisk-commits mailing list