[libpri-commits] rmudgett: branch group/issue14068 r743 - /team/group/issue14068/

SVN commits to the libpri project libpri-commits at lists.digium.com
Wed Apr 15 19:37:57 CDT 2009


Author: rmudgett
Date: Wed Apr 15 19:37:53 2009
New Revision: 743

URL: http://svn.digium.com/svn-view/libpri?view=rev&rev=743
Log:
Added ETSI Call-Diversion and Explicit-Call-Transfer encode/decode routines.

Added:
    team/group/issue14068/rose_etsi_diversion.c   (with props)
    team/group/issue14068/rose_etsi_ect.c   (with props)
Modified:
    team/group/issue14068/Makefile
    team/group/issue14068/pri_facility.c
    team/group/issue14068/rose.c
    team/group/issue14068/rose.h
    team/group/issue14068/rose_internal.h
    team/group/issue14068/rosetest.c

Modified: team/group/issue14068/Makefile
URL: http://svn.digium.com/svn-view/libpri/team/group/issue14068/Makefile?view=diff&rev=743&r1=742&r2=743
==============================================================================
--- team/group/issue14068/Makefile (original)
+++ team/group/issue14068/Makefile Wed Apr 15 19:37:53 2009
@@ -52,6 +52,8 @@
 	rose.o \
 	rose_address.o \
 	rose_etsi_aoc.o \
+	rose_etsi_diversion.o \
+	rose_etsi_ect.o \
 	rose_other.o \
 	rose_q931.o \
 	rose_qsig_ct.o \
@@ -70,6 +72,8 @@
 	rose.lo \
 	rose_address.lo \
 	rose_etsi_aoc.lo \
+	rose_etsi_diversion.lo \
+	rose_etsi_ect.lo \
 	rose_other.lo \
 	rose_q931.lo \
 	rose_qsig_ct.lo \

Modified: team/group/issue14068/pri_facility.c
URL: http://svn.digium.com/svn-view/libpri/team/group/issue14068/pri_facility.c?view=diff&rev=743&r1=742&r2=743
==============================================================================
--- team/group/issue14068/pri_facility.c (original)
+++ team/group/issue14068/pri_facility.c Wed Apr 15 19:37:53 2009
@@ -1970,7 +1970,31 @@
 		break;
 #endif	/* Not handled yet */
 #if 0	/* Not handled yet */
+	case ROSE_ETSI_ActivationDiversion:
+		break;
+	case ROSE_ETSI_DeactivationDiversion:
+		break;
+	case ROSE_ETSI_InterrogationDiversion:
+		break;
+	case ROSE_ETSI_CallDeflection:
+		break;
+	case ROSE_ETSI_CallRerouting:
+		break;
+	case ROSE_ETSI_InterrogateServedUserNumbers:
+		break;
+#endif	/* Not handled yet */
+#if 0	/* Not handled yet */
 	case ROSE_ETSI_ChargingRequest:
+		break;
+#endif	/* Not handled yet */
+#if 0	/* Not handled yet */
+	case ROSE_ETSI_EctExecute:
+		break;
+	case ROSE_ETSI_ExplicitEctExecute:
+		break;
+	case ROSE_ETSI_EctLinkIdRequest:
+		break;
+	case ROSE_ETSI_EctLoopTest:
 		break;
 #endif	/* Not handled yet */
 #if 0	/* Not handled yet */
@@ -2028,6 +2052,32 @@
 	const struct fac_extension_header *header, const struct rose_msg_invoke *invoke)
 {
 	switch (invoke->operation) {
+#if 0	/* Not handled yet */
+	case ROSE_ETSI_ActivationDiversion:
+		break;
+	case ROSE_ETSI_DeactivationDiversion:
+		break;
+	case ROSE_ETSI_ActivationStatusNotificationDiv:
+		break;
+	case ROSE_ETSI_DeactivationStatusNotificationDiv:
+		break;
+	case ROSE_ETSI_InterrogationDiversion:
+		break;
+	case ROSE_ETSI_DiversionInformation:
+		break;
+	case ROSE_ETSI_CallDeflection:
+		break;
+	case ROSE_ETSI_CallRerouting:
+		break;
+	case ROSE_ETSI_InterrogateServedUserNumbers:
+		break;
+	case ROSE_ETSI_DivertingLegInformation1:
+		break;
+	case ROSE_ETSI_DivertingLegInformation2:
+		break;
+	case ROSE_ETSI_DivertingLegInformation3:
+		break;
+#endif	/* Not handled yet */
 	case ROSE_ETSI_ChargingRequest:
 		/* Ignore messsage */
 		break;
@@ -2068,6 +2118,22 @@
 		break;
 #if 0	/* Not handled yet */
 	case ROSE_ITU_IdentificationOfCharge:
+		break;
+#endif	/* Not handled yet */
+#if 0	/* Not handled yet */
+	case ROSE_ETSI_EctExecute:
+		break;
+	case ROSE_ETSI_ExplicitEctExecute:
+		break;
+	case ROSE_ETSI_RequestSubaddress:
+		break;
+	case ROSE_ETSI_SubaddressTransfer:
+		break;
+	case ROSE_ETSI_EctLinkIdRequest:
+		break;
+	case ROSE_ETSI_EctInform:
+		break;
+	case ROSE_ETSI_EctLoopTest:
 		break;
 #endif	/* Not handled yet */
 	case ROSE_QSIG_CallingName:

Modified: team/group/issue14068/rose.c
URL: http://svn.digium.com/svn-view/libpri/team/group/issue14068/rose.c?view=diff&rev=743&r1=742&r2=743
==============================================================================
--- team/group/issue14068/rose.c (original)
+++ team/group/issue14068/rose.c Wed Apr 15 19:37:53 2009
@@ -192,6 +192,14 @@
  * First_Value = (First_Subidentifier * 40) + Second_Subidentifier
  */
 
+/*! \brief ETSI Explicit Call Transfer OID prefix. */
+static const struct asn1_oid rose_etsi_ect = {
+/* *INDENT-OFF* */
+	/* {ccitt(0) identified-organization(4) etsi(0) 369 operations-and-errors(1)} */
+	4, { 4, 0, 369, 1 }
+/* *INDENT-ON* */
+};
+
 /*! \brief ETSI specific invoke/result encode/decode message table */
 static const struct rose_convert_msg rose_etsi_msgs[] = {
 /* *INDENT-OFF* */
@@ -201,6 +209,71 @@
  *			decode_invoke_args,                     decode_result_args
  */
 	/*
+	 * localValue's from Diversion-Operations
+	 * {ccitt identified-organization etsi(0) 207 operations-and-errors(1)}
+	 */
+	{
+		ROSE_ETSI_ActivationDiversion,				NULL, 7,
+			rose_enc_etsi_ActivationDiversion_ARG,	NULL,
+			rose_dec_etsi_ActivationDiversion_ARG,	NULL
+	},
+	{
+		ROSE_ETSI_DeactivationDiversion,			NULL, 8,
+			rose_enc_etsi_DeactivationDiversion_ARG,NULL,
+			rose_dec_etsi_DeactivationDiversion_ARG,NULL
+	},
+	{
+		ROSE_ETSI_ActivationStatusNotificationDiv,	NULL, 9,
+			rose_enc_etsi_ActivationStatusNotificationDiv_ARG,NULL,
+			rose_dec_etsi_ActivationStatusNotificationDiv_ARG,NULL
+	},
+	{
+		ROSE_ETSI_DeactivationStatusNotificationDiv,NULL, 10,
+			rose_enc_etsi_DeactivationStatusNotificationDiv_ARG,NULL,
+			rose_dec_etsi_DeactivationStatusNotificationDiv_ARG,NULL
+	},
+	{
+		ROSE_ETSI_InterrogationDiversion,			NULL, 11,
+			rose_enc_etsi_InterrogationDiversion_ARG,rose_enc_etsi_InterrogationDiversion_RES,
+			rose_dec_etsi_InterrogationDiversion_ARG,rose_dec_etsi_InterrogationDiversion_RES
+	},
+	{
+		ROSE_ETSI_DiversionInformation,				NULL, 12,
+			rose_enc_etsi_DiversionInformation_ARG,	NULL,
+			rose_dec_etsi_DiversionInformation_ARG,	NULL
+	},
+	{
+		ROSE_ETSI_CallDeflection,					NULL, 13,
+			rose_enc_etsi_CallDeflection_ARG,		NULL,
+			rose_dec_etsi_CallDeflection_ARG,		NULL
+	},
+	{
+		ROSE_ETSI_CallRerouting,					NULL, 14,
+			rose_enc_etsi_CallRerouting_ARG,		NULL,
+			rose_dec_etsi_CallRerouting_ARG,		NULL
+	},
+	{
+		ROSE_ETSI_DivertingLegInformation2,			NULL, 15,
+			rose_enc_etsi_DivertingLegInformation2_ARG,NULL,
+			rose_dec_etsi_DivertingLegInformation2_ARG,NULL
+	},
+	{
+		ROSE_ETSI_InterrogateServedUserNumbers,		NULL, 17,
+			NULL,									rose_enc_etsi_InterrogateServedUserNumbers_RES,
+			NULL,									rose_dec_etsi_InterrogateServedUserNumbers_RES
+	},
+	{
+		ROSE_ETSI_DivertingLegInformation1,			NULL, 18,
+			rose_enc_etsi_DivertingLegInformation1_ARG,NULL,
+			rose_dec_etsi_DivertingLegInformation1_ARG,NULL
+	},
+	{
+		ROSE_ETSI_DivertingLegInformation3,			NULL, 19,
+			rose_enc_etsi_DivertingLegInformation3_ARG,NULL,
+			rose_dec_etsi_DivertingLegInformation3_ARG,NULL
+	},
+
+	/*
 	 * localValue's from Advice-of-Charge-Operations
 	 * {ccitt identified-organization etsi (0) 182 operations-and-errors (1)}
 	 *
@@ -243,6 +316,51 @@
 			rose_enc_etsi_AOCEChargingUnit_ARG,		NULL,
 			rose_dec_etsi_AOCEChargingUnit_ARG,		NULL
 	},
+
+	/*
+	 * localValue's from Explicit-Call-Transfer-Operations-and-Errors
+	 * {ccitt identified-organization etsi(0) 369 operations-and-errors(1)}
+	 */
+	{
+		ROSE_ETSI_EctExecute,						NULL, 6,
+			NULL,									NULL,
+			NULL,									NULL
+	},
+
+	/*
+	 * globalValue's (OIDs) from Explicit-Call-Transfer-Operations-and-Errors
+	 * {ccitt identified-organization etsi(0) 369 operations-and-errors(1)}
+	 */
+	{
+		ROSE_ETSI_ExplicitEctExecute,				&rose_etsi_ect, 1,
+			rose_enc_etsi_ExplicitEctExecute_ARG,	NULL,
+			rose_dec_etsi_ExplicitEctExecute_ARG,	NULL
+	},
+	{
+		ROSE_ETSI_RequestSubaddress,				&rose_etsi_ect, 2,
+			NULL,									NULL,
+			NULL,									NULL
+	},
+	{
+		ROSE_ETSI_SubaddressTransfer,				&rose_etsi_ect, 3,
+			rose_enc_etsi_SubaddressTransfer_ARG,	NULL,
+			rose_dec_etsi_SubaddressTransfer_ARG,	NULL
+	},
+	{
+		ROSE_ETSI_EctLinkIdRequest,					&rose_etsi_ect, 4,
+			NULL,									rose_enc_etsi_EctLinkIdRequest_RES,
+			NULL,									rose_dec_etsi_EctLinkIdRequest_RES
+	},
+	{
+		ROSE_ETSI_EctInform,						&rose_etsi_ect, 5,
+			rose_enc_etsi_EctInform_ARG,			NULL,
+			rose_dec_etsi_EctInform_ARG,			NULL
+	},
+	{
+		ROSE_ETSI_EctLoopTest,						&rose_etsi_ect, 6,
+			rose_enc_etsi_EctLoopTest_ARG,			rose_enc_etsi_EctLoopTest_RES,
+			rose_dec_etsi_EctLoopTest_ARG,			rose_dec_etsi_EctLoopTest_RES
+	},
 /* *INDENT-ON* */
 };
 
@@ -296,11 +414,53 @@
 	},
 
 	/*
+	 * localValue Errors from Diversion-Operations
+	 * {ccitt identified-organization etsi(0) 207 operations-and-errors(1)}
+	 */
+	{
+		ROSE_ERROR_Div_InvalidDivertedToNr,			NULL, 12,
+			NULL,									NULL
+	},
+	{
+		ROSE_ERROR_Div_SpecialServiceNr,			NULL, 14,
+			NULL,									NULL
+	},
+	{
+		ROSE_ERROR_Div_DiversionToServedUserNr,		NULL, 15,
+			NULL,									NULL
+	},
+	{
+		ROSE_ERROR_Div_IncomingCallAccepted,		NULL, 23,
+			NULL,									NULL
+	},
+	{
+		ROSE_ERROR_Div_NumberOfDiversionsExceeded,	NULL, 24,
+			NULL,									NULL
+	},
+	{
+		ROSE_ERROR_Div_NotActivated,				NULL, 46,
+			NULL,									NULL
+	},
+	{
+		ROSE_ERROR_Div_RequestAlreadyAccepted,		NULL, 48,
+			NULL,									NULL
+	},
+
+	/*
 	 * localValue Errors from Advice-of-Charge-Operations
 	 * {ccitt identified-organization etsi (0) 182 operations-and-errors (1)}
 	 */
 	{
 		ROSE_ERROR_AOC_NoChargingInfoAvailable,		NULL, 26,
+			NULL,									NULL
+	},
+
+	/*
+	 * globalValue Errors (OIDs) from Explicit-Call-Transfer-Operations-and-Errors
+	 * {ccitt identified-organization etsi(0) 369 operations-and-errors(1)}
+	 */
+	{
+		ROSE_ERROR_ECT_LinkIdNotAssignedByNetwork,	&rose_etsi_ect, 21,
 			NULL,									NULL
 	},
 /* *INDENT-ON* */
@@ -830,6 +990,27 @@
 /* *INDENT-OFF* */
 		{ ROSE_None,                                "ROSE_None" },
 		{ ROSE_Unknown,                             "ROSE_Unknown" },
+
+		{ ROSE_ETSI_ActivationDiversion,            "ROSE_ETSI_ActivationDiversion" },
+		{ ROSE_ETSI_DeactivationDiversion,          "ROSE_ETSI_DeactivationDiversion" },
+		{ ROSE_ETSI_ActivationStatusNotificationDiv,"ROSE_ETSI_ActivationStatusNotificationDiv" },
+		{ ROSE_ETSI_DeactivationStatusNotificationDiv,"ROSE_ETSI_DeactivationStatusNotificationDiv" },
+		{ ROSE_ETSI_InterrogationDiversion,         "ROSE_ETSI_InterrogationDiversion" },
+		{ ROSE_ETSI_DiversionInformation,           "ROSE_ETSI_DiversionInformation" },
+		{ ROSE_ETSI_CallDeflection,                 "ROSE_ETSI_CallDeflection" },
+		{ ROSE_ETSI_CallRerouting,                  "ROSE_ETSI_CallRerouting" },
+		{ ROSE_ETSI_DivertingLegInformation2,       "ROSE_ETSI_DivertingLegInformation2" },
+		{ ROSE_ETSI_InterrogateServedUserNumbers,   "ROSE_ETSI_InterrogateServedUserNumbers" },
+		{ ROSE_ETSI_DivertingLegInformation1,       "ROSE_ETSI_DivertingLegInformation1" },
+		{ ROSE_ETSI_DivertingLegInformation3,       "ROSE_ETSI_DivertingLegInformation3" },
+
+		{ ROSE_ETSI_EctExecute,                     "ROSE_ETSI_EctExecute" },
+		{ ROSE_ETSI_ExplicitEctExecute,             "ROSE_ETSI_ExplicitEctExecute" },
+		{ ROSE_ETSI_RequestSubaddress,              "ROSE_ETSI_RequestSubaddress" },
+		{ ROSE_ETSI_SubaddressTransfer,             "ROSE_ETSI_SubaddressTransfer" },
+		{ ROSE_ETSI_EctLinkIdRequest,               "ROSE_ETSI_EctLinkIdRequest" },
+		{ ROSE_ETSI_EctInform,                      "ROSE_ETSI_EctInform" },
+		{ ROSE_ETSI_EctLoopTest,                    "ROSE_ETSI_EctLoopTest" },
 
 		{ ROSE_ETSI_ChargingRequest,                "ROSE_ETSI_ChargingRequest" },
 		{ ROSE_ETSI_AOCSCurrency,                   "ROSE_ETSI_AOCSCurrency" },
@@ -914,9 +1095,14 @@
 		{ ROSE_ERROR_Div_InvalidDivertedToNr,         "Diversion: Invalid Diverted To Number" },
 		{ ROSE_ERROR_Div_SpecialServiceNr,            "Diversion: Special Service Number" },
 		{ ROSE_ERROR_Div_DiversionToServedUserNr,     "Diversion: Diversion To Served User Number" },
+		{ ROSE_ERROR_Div_IncomingCallAccepted,        "Diversion: Incoming Call Accepted" },
 		{ ROSE_ERROR_Div_NumberOfDiversionsExceeded,  "Diversion: Number Of Diversions Exceeded" },
+		{ ROSE_ERROR_Div_NotActivated,                "Diversion: Not Activated" },
+		{ ROSE_ERROR_Div_RequestAlreadyAccepted,      "Diversion: Request Already Accepted" },
 
 		{ ROSE_ERROR_AOC_NoChargingInfoAvailable,     "AOC: No Charging Info Available" },
+
+		{ ROSE_ERROR_ECT_LinkIdNotAssignedByNetwork,  "ECT: Link ID Not Assigned By Network" },
 
 		/* Q.SIG specific errors */
 		{ ROSE_ERROR_QSIG_Unspecified,                "Unspecified" },

Modified: team/group/issue14068/rose.h
URL: http://svn.digium.com/svn-view/libpri/team/group/issue14068/rose.h?view=diff&rev=743&r1=742&r2=743
==============================================================================
--- team/group/issue14068/rose.h (original)
+++ team/group/issue14068/rose.h Wed Apr 15 19:37:53 2009
@@ -65,6 +65,20 @@
 	ROSE_Unknown,
 
 /* *INDENT-OFF* */
+	/* ETSI Diversion-Operations */
+	ROSE_ETSI_ActivationDiversion,          /*!< Invoke/Result */
+	ROSE_ETSI_DeactivationDiversion,        /*!< Invoke/Result */
+	ROSE_ETSI_ActivationStatusNotificationDiv,/*!< Invoke only */
+	ROSE_ETSI_DeactivationStatusNotificationDiv,/*!< Invoke only */
+	ROSE_ETSI_InterrogationDiversion,       /*!< Invoke/Result */
+	ROSE_ETSI_DiversionInformation,         /*!< Invoke only */
+	ROSE_ETSI_CallDeflection,               /*!< Invoke/Result */
+	ROSE_ETSI_CallRerouting,                /*!< Invoke/Result */
+	ROSE_ETSI_InterrogateServedUserNumbers, /*!< Invoke/Result */
+	ROSE_ETSI_DivertingLegInformation1,     /*!< Invoke only */
+	ROSE_ETSI_DivertingLegInformation2,     /*!< Invoke only */
+	ROSE_ETSI_DivertingLegInformation3,     /*!< Invoke only */
+
 	/*
 	 * ETSI Advice-of-Charge-Operations
 	 *
@@ -79,6 +93,15 @@
 	ROSE_ETSI_AOCDChargingUnit,             /*!< Invoke only */
 	ROSE_ETSI_AOCECurrency,                 /*!< Invoke only */
 	ROSE_ETSI_AOCEChargingUnit,             /*!< Invoke only */
+
+	/* ETSI Explicit-Call-Transfer-Operations-and-Errors */
+	ROSE_ETSI_EctExecute,                   /*!< Invoke/Result */
+	ROSE_ETSI_ExplicitEctExecute,           /*!< Invoke/Result */
+	ROSE_ETSI_RequestSubaddress,            /*!< Invoke only */
+	ROSE_ETSI_SubaddressTransfer,           /*!< Invoke only */
+	ROSE_ETSI_EctLinkIdRequest,             /*!< Invoke/Result */
+	ROSE_ETSI_EctInform,                    /*!< Invoke only */
+	ROSE_ETSI_EctLoopTest,                  /*!< Invoke/Result */
 
 	/* Q.SIG Name-Operations */
 	ROSE_QSIG_CallingName,                  /*!< Invoke only */
@@ -155,10 +178,16 @@
 	ROSE_ERROR_Div_InvalidDivertedToNr,
 	ROSE_ERROR_Div_SpecialServiceNr,
 	ROSE_ERROR_Div_DiversionToServedUserNr,
+	ROSE_ERROR_Div_IncomingCallAccepted,
 	ROSE_ERROR_Div_NumberOfDiversionsExceeded,
+	ROSE_ERROR_Div_NotActivated,
+	ROSE_ERROR_Div_RequestAlreadyAccepted,
 
 	/* ETSI Advice-of-Charge-Operations */
 	ROSE_ERROR_AOC_NoChargingInfoAvailable,
+
+	/* ETSI Explicit-Call-Transfer-Operations-and-Errors */
+	ROSE_ERROR_ECT_LinkIdNotAssignedByNetwork,
 
 	/* Q.SIG from various specifications */
 	ROSE_ERROR_QSIG_Unspecified,
@@ -1028,6 +1057,602 @@
 	 * charging_unit(1)
 	 */
 	u_int8_t type;
+};
+
+
+/* ------------------------------------------------------------------- */
+
+
+/*
+ * ARGUMENT SEQUENCE {
+ *     procedure           Procedure,
+ *     basicService        BasicService,
+ *     forwardedToAddress  Address,
+ *     servedUserNr        ServedUserNr
+ * }
+ */
+struct roseEtsiActivationDiversion_ARG {
+	/*! \brief Forwarded to address */
+	struct roseAddress forwarded_to;
+
+	/*! \brief Forward all numbers if not present (Number length is zero). */
+	struct rosePartyNumber served_user_number;
+
+	/*! \details cfu(0), cfb(1), cfnr(2) */
+	u_int8_t procedure;
+
+	/*!
+	 * \details
+	 * allServices(0),
+	 * speech(1),
+	 * unrestrictedDigitalInformation(2),
+	 * audio3k1Hz(3),
+	 * unrestrictedDigitalInformationWithTonesAndAnnouncements(4),
+	 * multirate(5),
+	 * telephony3k1Hz(32),
+	 * teletex(33),
+	 * telefaxGroup4Class1(34),
+	 * videotexSyntaxBased(35),
+	 * videotelephony(36),
+	 * telefaxGroup2-3(37),
+	 * telephony7kHz(38),
+	 * euroFileTransfer(39),
+	 * fileTransferAndAccessManagement(40),
+	 * videoconference(41),
+	 * audioGraphicConference(42)
+	 */
+	u_int8_t basic_service;
+};
+
+
+/*
+ * ARGUMENT SEQUENCE {
+ *     procedure           Procedure,
+ *     basicService        BasicService,
+ *     servedUserNr        ServedUserNr
+ * }
+ */
+struct roseEtsiDeactivationDiversion_ARG {
+	/*! \brief Forward all numbers if not present (Number length is zero). */
+	struct rosePartyNumber served_user_number;
+
+	/*! \details cfu(0), cfb(1), cfnr(2) */
+	u_int8_t procedure;
+
+	/*!
+	 * \details
+	 * allServices(0),
+	 * speech(1),
+	 * unrestrictedDigitalInformation(2),
+	 * audio3k1Hz(3),
+	 * unrestrictedDigitalInformationWithTonesAndAnnouncements(4),
+	 * multirate(5),
+	 * telephony3k1Hz(32),
+	 * teletex(33),
+	 * telefaxGroup4Class1(34),
+	 * videotexSyntaxBased(35),
+	 * videotelephony(36),
+	 * telefaxGroup2-3(37),
+	 * telephony7kHz(38),
+	 * euroFileTransfer(39),
+	 * fileTransferAndAccessManagement(40),
+	 * videoconference(41),
+	 * audioGraphicConference(42)
+	 */
+	u_int8_t basic_service;
+};
+
+
+/*
+ * ARGUMENT SEQUENCE {
+ *     procedure           Procedure,
+ *     basicService        BasicService,
+ *     forwardedToAddresss Address,
+ *     servedUserNr        ServedUserNr
+ * }
+ */
+struct roseEtsiActivationStatusNotificationDiv_ARG {
+	/*! \brief Forwarded to address */
+	struct roseAddress forwarded_to;
+
+	/*! \brief Forward all numbers if not present (Number length is zero). */
+	struct rosePartyNumber served_user_number;
+
+	/*! \details cfu(0), cfb(1), cfnr(2) */
+	u_int8_t procedure;
+
+	/*!
+	 * \details
+	 * allServices(0),
+	 * speech(1),
+	 * unrestrictedDigitalInformation(2),
+	 * audio3k1Hz(3),
+	 * unrestrictedDigitalInformationWithTonesAndAnnouncements(4),
+	 * multirate(5),
+	 * telephony3k1Hz(32),
+	 * teletex(33),
+	 * telefaxGroup4Class1(34),
+	 * videotexSyntaxBased(35),
+	 * videotelephony(36),
+	 * telefaxGroup2-3(37),
+	 * telephony7kHz(38),
+	 * euroFileTransfer(39),
+	 * fileTransferAndAccessManagement(40),
+	 * videoconference(41),
+	 * audioGraphicConference(42)
+	 */
+	u_int8_t basic_service;
+};
+
+/*
+ * ARGUMENT SEQUENCE {
+ *     procedure           Procedure,
+ *     basicService        BasicService,
+ *     servedUserNr        ServedUserNr
+ * }
+ */
+struct roseEtsiDeactivationStatusNotificationDiv_ARG {
+	/*! \brief Forward all numbers if not present (Number length is zero). */
+	struct rosePartyNumber served_user_number;
+
+	/*! \details cfu(0), cfb(1), cfnr(2) */
+	u_int8_t procedure;
+
+	/*!
+	 * \details
+	 * allServices(0),
+	 * speech(1),
+	 * unrestrictedDigitalInformation(2),
+	 * audio3k1Hz(3),
+	 * unrestrictedDigitalInformationWithTonesAndAnnouncements(4),
+	 * multirate(5),
+	 * telephony3k1Hz(32),
+	 * teletex(33),
+	 * telefaxGroup4Class1(34),
+	 * videotexSyntaxBased(35),
+	 * videotelephony(36),
+	 * telefaxGroup2-3(37),
+	 * telephony7kHz(38),
+	 * euroFileTransfer(39),
+	 * fileTransferAndAccessManagement(40),
+	 * videoconference(41),
+	 * audioGraphicConference(42)
+	 */
+	u_int8_t basic_service;
+};
+
+
+/*
+ * ARGUMENT SEQUENCE {
+ *     procedure           Procedure,
+ *     basicService        BasicService DEFAULT allServices,
+ *     servedUserNr        ServedUserNr
+ * }
+ */
+struct roseEtsiInterrogationDiversion_ARG {
+	/*! \brief Forward all numbers if not present (Number length is zero). */
+	struct rosePartyNumber served_user_number;
+
+	/*! \details cfu(0), cfb(1), cfnr(2) */
+	u_int8_t procedure;
+
+	/*!
+	 * \details
+	 * DEFAULT allServices
+	 *
+	 * \details
+	 * allServices(0),
+	 * speech(1),
+	 * unrestrictedDigitalInformation(2),
+	 * audio3k1Hz(3),
+	 * unrestrictedDigitalInformationWithTonesAndAnnouncements(4),
+	 * multirate(5),
+	 * telephony3k1Hz(32),
+	 * teletex(33),
+	 * telefaxGroup4Class1(34),
+	 * videotexSyntaxBased(35),
+	 * videotelephony(36),
+	 * telefaxGroup2-3(37),
+	 * telephony7kHz(38),
+	 * euroFileTransfer(39),
+	 * fileTransferAndAccessManagement(40),
+	 * videoconference(41),
+	 * audioGraphicConference(42)
+	 */
+	u_int8_t basic_service;
+};
+
+/*
+ * IntResult ::= SEQUENCE {
+ *     servedUserNr        ServedUserNr,
+ *     basicService        BasicService,
+ *     procedure           Procedure,
+ *     forwardedToAddress  Address
+ * }
+ */
+struct roseEtsiForwardingRecord {
+	/*! \brief Forwarded to address */
+	struct roseAddress forwarded_to;
+
+	/*! \brief Forward all numbers if not present (Number length is zero). */
+	struct rosePartyNumber served_user_number;
+
+	/*! \details cfu(0), cfb(1), cfnr(2) */
+	u_int8_t procedure;
+
+	/*!
+	 * \details
+	 * allServices(0),
+	 * speech(1),
+	 * unrestrictedDigitalInformation(2),
+	 * audio3k1Hz(3),
+	 * unrestrictedDigitalInformationWithTonesAndAnnouncements(4),
+	 * multirate(5),
+	 * telephony3k1Hz(32),
+	 * teletex(33),
+	 * telefaxGroup4Class1(34),
+	 * videotexSyntaxBased(35),
+	 * videotelephony(36),
+	 * telefaxGroup2-3(37),
+	 * telephony7kHz(38),
+	 * euroFileTransfer(39),
+	 * fileTransferAndAccessManagement(40),
+	 * videoconference(41),
+	 * audioGraphicConference(42)
+	 */
+	u_int8_t basic_service;
+};
+
+/*
+ * roseInterrogationDiversion_RES
+ * IntResultList ::= SET SIZE (0..29) OF IntResult
+ */
+struct roseEtsiForwardingList {
+	/*!
+	 * \brief SET SIZE (0..29) OF Forwarding Records
+	 * \note Reduced the size of the array to conserve
+	 * potential stack usage.
+	 */
+	struct roseEtsiForwardingRecord list[10];
+
+	/*! \brief Number of Forwarding records present */
+	u_int8_t num_records;
+};
+
+/*
+ * ARGUMENT SEQUENCE {
+ *     diversionReason         DiversionReason,
+ *     basicService            BasicService,
+ *     servedUserSubaddress    PartySubaddress OPTIONAL,
+ *     callingAddress          [0] EXPLICIT PresentedAddressScreened OPTIONAL,
+ *     originalCalledNr        [1] EXPLICIT PresentedNumberUnscreened OPTIONAL,
+ *     lastDivertingNr         [2] EXPLICIT PresentedNumberUnscreened OPTIONAL,
+ *     lastDivertingReason     [3] EXPLICIT DiversionReason OPTIONAL,
+ *
+ *     -- The User-user information element, as specified
+ *     -- in ETS 300 102-1 [11], subclause 4.5.29, shall
+ *     -- be embedded in the userInfo parameter.
+ *     userInfo                Q931InformationElement OPTIONAL
+ * }
+ */
+struct roseEtsiDiversionInformation_ARG {
+	/*! \brief Served user subaddress (Optional) */
+	struct rosePartySubaddress served_user_subaddress;
+
+	/*! \brief Calling address (Optional) */
+	struct rosePresentedAddressScreened calling;
+
+	/*! \brief Original called number (Optional) */
+	struct rosePresentedNumberUnscreened original_called;
+
+	/*! \brief Last diverting number (Optional) */
+	struct rosePresentedNumberUnscreened last_diverting;
+
+	/*! \brief User-User information embedded in Q.931 IE (Optional) */
+	struct roseQ931ie q931ie;
+	/*! \brief q931ie.contents "allocated" after the stucture. */
+	unsigned char q931ie_contents[ROSE_Q931_MAX_USER + 1];
+
+	/*!
+	 * \brief Last diverting reason (Optional)
+	 *
+	 * \details
+	 * unknown(0),
+	 * cfu(1),
+	 * cfb(2),
+	 * cfnr(3),
+	 * cdAlerting(4),
+	 * cdImmediate(5)
+	 */
+	u_int8_t last_diverting_reason;
+
+	/*! \brief TRUE if CallingAddress is present */
+	u_int8_t calling_present;
+
+	/*! \brief TRUE if OriginalCalled is present */
+	u_int8_t original_called_present;
+
+	/*! \brief TRUE if LastDiverting is present */
+	u_int8_t last_diverting_present;
+
+	/*! \brief TRUE if LastDivertingReason is present */
+	u_int8_t last_diverting_reason_present;
+
+	/*!
+	 * \details
+	 * unknown(0),
+	 * cfu(1),
+	 * cfb(2),
+	 * cfnr(3),
+	 * cdAlerting(4),
+	 * cdImmediate(5)
+	 */
+	u_int8_t diversion_reason;
+
+	/*!
+	 * \details
+	 * allServices(0),
+	 * speech(1),
+	 * unrestrictedDigitalInformation(2),
+	 * audio3k1Hz(3),
+	 * unrestrictedDigitalInformationWithTonesAndAnnouncements(4),
+	 * multirate(5),
+	 * telephony3k1Hz(32),
+	 * teletex(33),
+	 * telefaxGroup4Class1(34),
+	 * videotexSyntaxBased(35),
+	 * videotelephony(36),
+	 * telefaxGroup2-3(37),
+	 * telephony7kHz(38),
+	 * euroFileTransfer(39),
+	 * fileTransferAndAccessManagement(40),
+	 * videoconference(41),
+	 * audioGraphicConference(42)
+	 */
+	u_int8_t basic_service;
+};
+
+
+/*
+ * ARGUMENT SEQUENCE {
+ *     deflectionAddress                 Address,
+ *     presentationAllowedDivertedToUser PresentationAllowedIndicator OPTIONAL
+ * }
+ */
+struct roseEtsiCallDeflection_ARG {
+	/*! \brief Deflection address (Deflected-To address) */
+	struct roseAddress deflection;
+
+	/*! \brief TRUE if PresentationAllowedToDivertedToUser is present */
+	u_int8_t presentation_allowed_to_diverted_to_user_present;
+
+	/*! \brief TRUE if presentation is allowed (Optional) */
+	u_int8_t presentation_allowed_to_diverted_to_user;
+};
+
+
+/*
+ * ARGUMENT SEQUENCE {
+ *     reroutingReason         DiversionReason,
+ *     calledAddress           Address,
+ *     reroutingCounter        DiversionCounter,
+ *
+ *     -- The User-user information element (optional),
+ *     -- High layer compatibility information element (optional),
+ *     -- Bearer capability information element
+ *     -- and Low layer compatibility information element (optional)
+ *     -- as specified in ETS 300 102-1 [11] subclause 4.5 shall be
+ *     -- embedded in the q931InfoElement.
+ *     q931InfoElement         Q931InformationElement,
+ *     lastReroutingNr         [1] EXPLICIT PresentedNumberUnscreened,
+ *     subscriptionOption      [2] EXPLICIT SubscriptionOption DEFAULT noNotification,
+ *     callingPartySubaddress  [3] EXPLICIT PartySubaddress OPTIONAL
+ * }
+ */
+struct roseEtsiCallRerouting_ARG {
+	struct roseAddress called_address;
+
+	/*! \brief The BC, HLC (optional), LLC (optional), and User-user (optional) information */
+	struct roseQ931ie q931ie;
+	/*! \brief q931ie.contents "allocated" after the stucture. */
+	unsigned char q931ie_contents[ROSE_Q931_MAX_BC + ROSE_Q931_MAX_HLC +
+		ROSE_Q931_MAX_LLC + ROSE_Q931_MAX_USER + 1];
+
+	/*! \brief Last rerouting number */
+	struct rosePresentedNumberUnscreened last_rerouting;
+
+	/*! \brief Calling party subaddress (Optional) */
+	struct rosePartySubaddress calling_subaddress;
+
+	/*!
+	 * \details
+	 * unknown(0),
+	 * cfu(1),
+	 * cfb(2),
+	 * cfnr(3),
+	 * cdAlerting(4),
+	 * cdImmediate(5)
+	 */
+	u_int8_t rerouting_reason;
+
+	/*! \brief Range 1-5 */
+	u_int8_t rerouting_counter;
+
+	/*!
+	 * \details
+	 * DEFAULT noNotification
+	 *
+	 * \details
+	 * noNotification(0),
+	 * notificationWithoutDivertedToNr(1),
+	 * notificationWithDivertedToNr(2)
+	 */
+	u_int8_t subscription_option;
+};
+
+
+/*
+ * roseInterrogateServedUserNumbers_RES
+ * ServedUserNumberList ::= SET SIZE (0..99) OF PartyNumber
+ */
+struct roseEtsiServedUserNumberList {
+	/*!
+	 * \brief SET SIZE (0..99) OF Served user numbers
+	 * \note Reduced the size of the array to conserve
+	 * potential stack usage.
+	 */
+	struct rosePartyNumber number[20];
+
+	/*! \brief Number of Served user numbers present */
+	u_int8_t num_records;
+};
+
+
+/*
+ * ARGUMENT SEQUENCE {
+ *     diversionReason     DiversionReason,
+ *     subscriptionOption  SubscriptionOption,
+ *     divertedToNumber    PresentedNumberUnscreened OPTIONAL
+ * }
+ */
+struct roseEtsiDivertingLegInformation1_ARG {
+	/*! \brief Diverted to number (Optional) */
+	struct rosePresentedNumberUnscreened diverted_to;
+
+	/*! \brief TRUE if DivertedTo is present */
+	u_int8_t diverted_to_present;
+
+	/*!
+	 * \details
+	 * unknown(0),
+	 * cfu(1),
+	 * cfb(2),
+	 * cfnr(3),
+	 * cdAlerting(4),
+	 * cdImmediate(5)
+	 */
+	u_int8_t diversion_reason;
+
+	/*!
+	 * \details
+	 * noNotification(0),
+	 * notificationWithoutDivertedToNr(1),
+	 * notificationWithDivertedToNr(2)
+	 */
+	u_int8_t subscription_option;
+};
+
+/*
+ * ARGUMENT SEQUENCE {
+ *     diversionCounter    DiversionCounter,
+ *     diversionReason     DiversionReason,
+ *     divertingNr         [1] EXPLICIT PresentedNumberUnscreened OPTIONAL,
+ *     originalCalledNr    [2] EXPLICIT PresentedNumberUnscreened OPTIONAL
+ * }
+ */
+struct roseEtsiDivertingLegInformation2_ARG {
+	/*! \brief Diverting number (Optional) */
+	struct rosePresentedNumberUnscreened diverting;
+
+	/*! \brief Original called number (Optional) */
+	struct rosePresentedNumberUnscreened original_called;
+
+	/*! \brief TRUE if Diverting number is present */
+	u_int8_t diverting_present;
+
+	/*! \brief TRUE if OriginalCalled is present */
+	u_int8_t original_called_present;
+
+	/*!
+	 * \details
+	 * unknown(0),
+	 * cfu(1),
+	 * cfb(2),
+	 * cfnr(3),
+	 * cdAlerting(4),
+	 * cdImmediate(5)
+	 */
+	u_int8_t diversion_reason;
+
+	/*! \brief Range 1-5 */
+	u_int8_t diversion_counter;
+};
+
+/*
+ * ARGUMENT presentationAllowedIndicator PresentationAllowedIndicator
+ */
+struct roseEtsiDivertingLegInformation3_ARG {
+	/*! \brief TRUE if presentation is allowed */
+	u_int8_t presentation_allowed_indicator;
+};
+
+
+/* ------------------------------------------------------------------- */
+
+
+/*
+ * ARGUMENT LinkId
+ */
+struct roseEtsiExplicitEctExecute_ARG {
+	int16_t link_id;
+};
+
+/*
+ * ARGUMENT transferredToSubaddress PartySubaddress
+ */
+struct roseEtsiSubaddressTransfer_ARG {
+	/*! \brief Transferred to subaddress */
+	struct rosePartySubaddress subaddress;
+};
+
+
+/*
+ * RESULT LinkId
+ */
+struct roseEtsiEctLinkIdRequest_RES {
+	int16_t link_id;
+};
+
+
+/*
+ * ARGUMENT SEQUENCE {
+ *     ENUMERATED {
+ *         alerting (0),
+ *         active   (1)
+ *     },
+ *     redirectionNumber PresentedNumberUnscreened OPTIONAL
+ * }
+ */
+struct roseEtsiEctInform_ARG {
+	/*! \brief Redirection Number (Optional) */
+	struct rosePresentedNumberUnscreened redirection;
+
+	/*! \brief TRUE if the Redirection Number is present */
+	u_int8_t redirection_present;
+
+	/*! \details alerting(0), active(1) */
+	u_int8_t status;
+};
+
+
+/*
+ * ARGUMENT CallTransferIdentity
+ */
+struct roseEtsiEctLoopTest_ARG {
+	int8_t call_transfer_id;
+};
+
+/*
+ * RESULT LoopResult
+ */
+struct roseEtsiEctLoopTest_RES {
+	/*!
+	 * \details
+	 * insufficientInformation(0),
+	 * noLoopExists(1),
+	 * simultaneousTransfer(2)
+	 */
+	u_int8_t loop_result;
 };
 
 
@@ -2177,12 +2802,40 @@
 	struct roseEtsiAOCDChargingUnit_ARG AOCDChargingUnit;
 	struct roseEtsiAOCECurrency_ARG AOCECurrency;
 	struct roseEtsiAOCEChargingUnit_ARG AOCEChargingUnit;
+
+	/* ETSI Call Diversion */
+	struct roseEtsiActivationDiversion_ARG ActivationDiversion;
+	struct roseEtsiDeactivationDiversion_ARG DeactivationDiversion;
+	struct roseEtsiActivationStatusNotificationDiv_ARG ActivationStatusNotificationDiv;
+	struct roseEtsiDeactivationStatusNotificationDiv_ARG
+		DeactivationStatusNotificationDiv;
+	struct roseEtsiInterrogationDiversion_ARG InterrogationDiversion;
+	struct roseEtsiDiversionInformation_ARG DiversionInformation;
+	struct roseEtsiCallDeflection_ARG CallDeflection;
+	struct roseEtsiCallRerouting_ARG CallRerouting;
+	struct roseEtsiDivertingLegInformation1_ARG DivertingLegInformation1;
+	struct roseEtsiDivertingLegInformation2_ARG DivertingLegInformation2;
+	struct roseEtsiDivertingLegInformation3_ARG DivertingLegInformation3;
+
+	/* ETSI Explicit Call Transfer (ECT) */
+	struct roseEtsiExplicitEctExecute_ARG ExplicitEctExecute;
+	struct roseEtsiSubaddressTransfer_ARG SubaddressTransfer;
+	struct roseEtsiEctInform_ARG EctInform;
+	struct roseEtsiEctLoopTest_ARG EctLoopTest;
 };
 
 /*! \brief Facility ie result etsi messages with arguments. */
 union rose_msg_result_etsi_args {
 	/* ETSI Advice Of Charge (AOC) */
 	struct roseEtsiChargingRequest_RES ChargingRequest;
+
+	/* ETSI Call Diversion */
+	struct roseEtsiForwardingList InterrogationDiversion;
+	struct roseEtsiServedUserNumberList InterrogateServedUserNumbers;
+
+	/* ETSI Explicit Call Transfer (ECT) */
+	struct roseEtsiEctLinkIdRequest_RES EctLinkIdRequest;
+	struct roseEtsiEctLoopTest_RES EctLoopTest;
 };
 
 /*! \brief Facility ie invoke qsig messages with arguments. */

Added: team/group/issue14068/rose_etsi_diversion.c
URL: http://svn.digium.com/svn-view/libpri/team/group/issue14068/rose_etsi_diversion.c?view=auto&rev=743
==============================================================================
--- team/group/issue14068/rose_etsi_diversion.c (added)
+++ team/group/issue14068/rose_etsi_diversion.c Wed Apr 15 19:37:53 2009
@@ -1,0 +1,1623 @@
+/*
+ * libpri: An implementation of Primary Rate ISDN
+ *
+ * Copyright (C) 2009 Digium, Inc.
+ *
+ * Richard Mudgett <rmudgett at digium.com>
+ *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License Version 2 as published by the
+ * Free Software Foundation. See the LICENSE file included with
+ * this program for more details.
+ *
+ * In addition, when this program is distributed with Asterisk in
+ * any form that would qualify as a 'combined work' or as a
+ * 'derivative work' (but not mere aggregation), you can redistribute
+ * and/or modify the combination under the terms of the license
+ * provided with that copy of Asterisk, instead of the license
+ * terms granted here.
+ */
+
+/*!
+ * \file
+ * \brief ROSE Call diversion operations
+ *
+ * Diversion Supplementary Services ETS 300 207-1 Table 3
+ *
+ * \author Richard Mudgett <rmudgett at digium.com>
+ */
+
+
+#include "compat.h"
+#include "libpri.h"
+#include "pri_internal.h"
+#include "rose.h"
+#include "rose_internal.h"
+#include "asn1.h"
+
+
+/* ------------------------------------------------------------------- */
+
+/*!
+ * \internal
+ * \brief Encode the ServedUserNr type.
+ *
+ * \param ctrl D channel controller for diagnostic messages or global options.
+ * \param pos Starting position to encode ASN.1 component.
+ * \param end End of ASN.1 encoding data buffer.
+ * \param served_user_number Served user number information to encode.
+ *
+ * \retval Start of the next ASN.1 component to encode on success.
+ * \retval NULL on error.
+ */
+static unsigned char *rose_enc_etsi_ServedUserNumber(struct pri *ctrl,
+	unsigned char *pos, unsigned char *end,
+	const struct rosePartyNumber *served_user_number)
+{
+	if (served_user_number->length) {
+		/* Forward this number */
+		pos = rose_enc_PartyNumber(ctrl, pos, end, served_user_number);
+	} else {
+		/* Forward all numbers */
+		pos = asn1_enc_null(pos, end, ASN1_TYPE_NULL);
+	}
+
+	return pos;
+}
+
+/*!
+ * \internal
+ * \brief Encode the IntResult type.
+ *
+ * \param ctrl D channel controller for diagnostic messages or global options.
+ * \param pos Starting position to encode ASN.1 component.
+ * \param end End of ASN.1 encoding data buffer.
+ * \param tag Component tag to identify the encoded component.
+ *   The tag should be ASN1_TAG_SEQUENCE unless the caller implicitly
+ *   tags it otherwise.
+ * \param int_result Forwarding record information to encode.
+ *
+ * \retval Start of the next ASN.1 component to encode on success.
+ * \retval NULL on error.
+ */
+static unsigned char *rose_enc_etsi_IntResult(struct pri *ctrl, unsigned char *pos,
+	unsigned char *end, unsigned tag, const struct roseEtsiForwardingRecord *int_result)
+{
+	unsigned char *seq_len;
+
+	ASN1_CONSTRUCTED_BEGIN(seq_len, pos, end, tag);
+
+	ASN1_CALL(pos, rose_enc_etsi_ServedUserNumber(ctrl, pos, end,
+		&int_result->served_user_number));
+	ASN1_CALL(pos, asn1_enc_int(pos, end, ASN1_TYPE_ENUMERATED,
+		int_result->basic_service));
+	ASN1_CALL(pos, asn1_enc_int(pos, end, ASN1_TYPE_ENUMERATED, int_result->procedure));
+	ASN1_CALL(pos, rose_enc_Address(ctrl, pos, end, ASN1_TAG_SEQUENCE,
+		&int_result->forwarded_to));
+
+	ASN1_CONSTRUCTED_END(seq_len, pos, end);
+
+	return pos;
+}
+
+/*!
+ * \internal
+ * \brief Encode the IntResultList type.
+ *
+ * \param ctrl D channel controller for diagnostic messages or global options.
+ * \param pos Starting position to encode ASN.1 component.
+ * \param end End of ASN.1 encoding data buffer.
+ * \param tag Component tag to identify the encoded component.
+ *   The tag should be ASN1_TAG_SET unless the caller implicitly
+ *   tags it otherwise.
+ * \param int_result_list Forwarding record list information to encode.
+ *
+ * \retval Start of the next ASN.1 component to encode on success.
+ * \retval NULL on error.
+ */
+static unsigned char *rose_enc_etsi_IntResultList(struct pri *ctrl, unsigned char *pos,
+	unsigned char *end, unsigned tag,
+	const struct roseEtsiForwardingList *int_result_list)
+{
+	unsigned index;
+	unsigned char *set_len;
+
+	ASN1_CONSTRUCTED_BEGIN(set_len, pos, end, tag);
+
+	for (index = 0; index < int_result_list->num_records; ++index) {
+		ASN1_CALL(pos, rose_enc_etsi_IntResult(ctrl, pos, end, ASN1_TAG_SEQUENCE,
+			&int_result_list->list[index]));
+	}
+
+	ASN1_CONSTRUCTED_END(set_len, pos, end);
+
+	return pos;
+}
+
+/*!
+ * \internal
+ * \brief Encode the ServedUserNumberList type.
+ *
+ * \param ctrl D channel controller for diagnostic messages or global options.
+ * \param pos Starting position to encode ASN.1 component.
+ * \param end End of ASN.1 encoding data buffer.
+ * \param tag Component tag to identify the encoded component.
+ *   The tag should be ASN1_TAG_SET unless the caller implicitly
+ *   tags it otherwise.
+ * \param served_user_number_list Served user record list information to encode.
+ *
+ * \retval Start of the next ASN.1 component to encode on success.
+ * \retval NULL on error.
+ */
+static unsigned char *rose_enc_etsi_ServedUserNumberList(struct pri *ctrl,
+	unsigned char *pos, unsigned char *end, unsigned tag,
+	const struct roseEtsiServedUserNumberList *served_user_number_list)
+{
+	unsigned index;
+	unsigned char *set_len;
+
+	ASN1_CONSTRUCTED_BEGIN(set_len, pos, end, tag);
+
+	for (index = 0; index < served_user_number_list->num_records; ++index) {
+		ASN1_CALL(pos, rose_enc_PartyNumber(ctrl, pos, end,
+			&served_user_number_list->number[index]));
+	}
+
+	ASN1_CONSTRUCTED_END(set_len, pos, end);
+
+	return pos;
+}
+
+/*!
+ * \brief Encode the ActivationDiversion invoke facility ie arguments.
+ *
+ * \param ctrl D channel controller for diagnostic messages or global options.
+ * \param pos Starting position to encode ASN.1 component.
+ * \param end End of ASN.1 encoding data buffer.
+ * \param args Arguments to encode in the buffer.
+ *
+ * \retval Start of the next ASN.1 component to encode on success.
+ * \retval NULL on error.
+ */
+unsigned char *rose_enc_etsi_ActivationDiversion_ARG(struct pri *ctrl,
+	unsigned char *pos, unsigned char *end, const union rose_msg_invoke_args *args)
+{
+	const struct roseEtsiActivationDiversion_ARG *activation_diversion;
+	unsigned char *seq_len;
+
+	ASN1_CONSTRUCTED_BEGIN(seq_len, pos, end, ASN1_TAG_SEQUENCE);
+
+	activation_diversion = &args->etsi.ActivationDiversion;
+	ASN1_CALL(pos, asn1_enc_int(pos, end, ASN1_TYPE_ENUMERATED,
+		activation_diversion->procedure));
+	ASN1_CALL(pos, asn1_enc_int(pos, end, ASN1_TYPE_ENUMERATED,
+		activation_diversion->basic_service));
+	ASN1_CALL(pos, rose_enc_Address(ctrl, pos, end, ASN1_TAG_SEQUENCE,
+		&activation_diversion->forwarded_to));
+	ASN1_CALL(pos, rose_enc_etsi_ServedUserNumber(ctrl, pos, end,
+		&activation_diversion->served_user_number));
+
+	ASN1_CONSTRUCTED_END(seq_len, pos, end);
+
+	return pos;
+}
+
+/*!
+ * \brief Encode the DeactivationDiversion invoke facility ie arguments.
+ *
+ * \param ctrl D channel controller for diagnostic messages or global options.
+ * \param pos Starting position to encode ASN.1 component.
+ * \param end End of ASN.1 encoding data buffer.

[... 2360 lines stripped ...]



More information about the libpri-commits mailing list