[libss7-commits] mattf: trunk r116 - in /trunk: isup.c isup.h libss7.h

SVN commits to the libss7 project libss7-commits at lists.digium.com
Thu Oct 11 15:10:26 CDT 2007


Author: mattf
Date: Thu Oct 11 15:10:26 2007
New Revision: 116

URL: http://svn.digium.com/view/libss7?view=rev&rev=116
Log:
Add support for CCR test, specifiable charge number in ANSI, and a few other things

Modified:
    trunk/isup.c
    trunk/isup.h
    trunk/libss7.h

Modified: trunk/isup.c
URL: http://svn.digium.com/view/libss7/trunk/isup.c?view=diff&rev=116&r1=115&r2=116
==============================================================================
--- trunk/isup.c (original)
+++ trunk/isup.c Thu Oct 11 15:10:26 2007
@@ -89,6 +89,7 @@
 	{ISUP_COT, 1, 0, 0, cot_params},
 	{ISUP_CCR, 0, 0, 0, empty_params},
 	{ISUP_BLO, 0, 0, 0, empty_params},
+	{ISUP_LPA, 0, 0, 0, empty_params},
 	{ISUP_UBL, 0, 0, 0, empty_params},
 	{ISUP_BLA, 0, 0, 0, empty_params},
 	{ISUP_UBA, 0, 0, 0, empty_params},
@@ -142,6 +143,8 @@
 			return "CPG";
 		case ISUP_UCIC:
 			return "UCIC";
+		case ISUP_LPA:
+			return "LPA";
 		default:
 			return "Unknown";
 	}
@@ -255,7 +258,7 @@
 
 	if (c->cot_check_required)
 		parm[0] |= 0x04;
-	
+
 	return 1; /* Length plus size of type header */
 }
 
@@ -275,7 +278,7 @@
 {
 	unsigned char con = parm[0];
 	char *continuity;
-	
+
 	ss7_message(ss7, "\t\t\tSatellites in connection: %d\n", con&0x03);
 	con>>=2; 
 	switch (con & 0x03) {
@@ -331,7 +334,7 @@
 {
 	return 1;
 }
-	
+
 static FUNC_SEND(calling_party_cat_transmit)
 {
 	parm[0] = 0x0a; /* Default to Ordinary calling subscriber */
@@ -473,7 +476,7 @@
 
 	if (parm[0] & 0x80)
 		odd = 1;
-	
+
 	isup_get_number(c->called_party_num, &parm[2], len - 2, odd);
 
 	c->called_nai = parm[0] & 0x7f; /* Nature of Address Indicator */
@@ -488,7 +491,7 @@
 	isup_put_number(&parm[2], c->called_party_num, &numlen, &oddeven);
 
 	parm[0] = c->called_nai & 0x7f; /* Nature of Address Indicator */
-	
+
 	if (oddeven)
 		parm[0] |= 0x80; /* Odd number of digits */
 
@@ -681,7 +684,7 @@
 
 	if (messagetype == ISUP_GRS)
 		return 1;
-	
+
 	statuslen = (numcics / 8) + !!(numcics % 8);
 
 	if (messagetype == ISUP_GRA) {
@@ -728,13 +731,13 @@
 	c->screening_ind = parm[1] & 0x3;
 
 	return len;
-	
+
 }
 
 static FUNC_SEND(calling_party_num_transmit)
 {
 	int oddeven, datalen;
-    	
+
 	if (!c->calling_party_num[0])
 		return 0;
 
@@ -742,8 +745,8 @@
 
 	parm[0] = (oddeven << 7) | c->calling_nai;      /* Nature of Address Indicator */
 	parm[1] = (1 << 4) |                            /* Assume E.164 ISDN numbering plan, calling number complete */
-	    ((c->presentation_ind & 0x3) << 2) |
-	    (c->screening_ind & 0x3);
+		((c->presentation_ind & 0x3) << 2) |
+		(c->screening_ind & 0x3);
 
 	return datalen + 2;
 }
@@ -751,212 +754,218 @@
 static FUNC_DUMP(originating_line_information_dump)
 {
 	char *name;
-	
+
 	switch (parm[0]) {
-	case 0:
-		name = " Plain Old Telephone Service POTS";
-		break;
-	case 1:
-		name = " Multiparty line";
-		break;
-	case 2:
-		name = " ANI Failure";
-		break;
-	case 3:
-	case 4:
-	case 5:
-		name = " Unassigned";
-		break;
-	case 6:
-		name = " Station Level Rating";
-		break;
-	case 7:
-		name = " Special Operator Handling Required";
-		break;
-	case 8:
-	case 9:
-		name = "Unassigned";
-		break;
-	case 10:
-		name = "Not assignable";
-		break;
-	case 11:
-		name = "Unassigned";
-		break;
-	case 12:
-	case 13:
-	case 14:
-	case 15:
-	case 16:
-	case 17:
-	case 18:
-	case 19:
-		name = "Not assignable";
-		break;
-	case 20:
-		name = "Automatic Identified Outward Dialing";
-		break;
-	case 21:
-	case 22:
-		name = "Unassigned";
-		break;
-	case 23:
-		name = "Coin or Non-Coin";
-		break;
-	case 24:
-	case 25:
-		name = "Toll Free Service translated to POTS";
-		break;
-	case 26:
-		name = "Unassigned";
-		break;
-	case 27:
-		name = "Pay Station using Coin Control Signalling";
-		break;
-	case 28:
-		name = "Unassigned";
-		break;
-	case 29:
-		name = "Prison/Inmate Service";
-		break;
-	case 30:
-	case 31:
-	case 32:
-		name = "Intercept";
-		break;
-	case 33:
-		name = "Unassigned";
-		break;
-	case 34:
-		name = "Telco Operator Handled Call";
-		break;
-	case 35:
-	case 36:
-	case 37:
-	case 38:
-	case 39:
-		name = "Unassigned";
-		break;
-	case 40:
-	case 41:
-	case 42:
-	case 43:
-	case 44:
-	case 45:
-	case 46:
-	case 47:
-	case 48:
-	case 49:
-		name = "Unrestricted Use - locally determined by carrier";
-		break;
-	case 50:
-	case 51:
-		name = "Unassigned";
-		break;
-	case 52:
-		name = "OUTWATS";
-		break;
-	case 53:
-	case 54:
-	case 55:
-	case 56:
-	case 57:
-	case 58:
-	case 59:
-		name = "Unassigned";
-		break;
-	case 60:
-		name = "TRS Unrestricted Line";
-		break;
-	case 61:
-		name = "Cellular Wireless PCS Type 1";
-		break;
-	case 62:
-		name = "Cellular Wireless PCS Type 2";
-		break;
-	case 63:
-		name = "Cellular Wireless PCS Roaming";
-		break;
-	case 64:
-	case 65:
-		name = "Unassigned";
-		break;
-	case 66:
-		name = "TRS Hotel Motel";
-		break;
-	case 67:
-		name = "TRS Restricted Line";
-		break;
-	case 68:
-	case 69:
-		name = "Unassigned";
-		break;
-	case 70:
-		name = "Pay Station No network Coin Control Signalling";
-		break;
-	case 71:
-	case 72:
-	case 73:
-	case 74:
-	case 75:
-	case 76:
-	case 77:
-	case 78:
-	case 79:
-		name = "Unassigned";
-		break;
-	case 80:
-	case 81:
-	case 82:
-	case 83:
-	case 84:
-	case 85:
-	case 86:
-	case 87:
-	case 88:
-	case 89:
-		name = "Reserved";
-		break;
-	case 90:
-	case 91:
-	case 92:
-		name = "Unassigned";
-		break;
-	case 93:
-		name = "Private Virtual Network Type of service call";
-		break;
-	case 94:
-	case 95:
-	case 96:
-	case 97:
-	case 98:
-	case 99:
-		name = "Unassigned";
-		break;
-
-	default:
-		name = "Unknown to Asterisk ";
-		
+		case 0:
+			name = " Plain Old Telephone Service POTS";
+			break;
+		case 1:
+			name = " Multiparty line";
+			break;
+		case 2:
+			name = " ANI Failure";
+			break;
+		case 3:
+		case 4:
+		case 5:
+			name = " Unassigned";
+			break;
+		case 6:
+			name = " Station Level Rating";
+			break;
+		case 7:
+			name = " Special Operator Handling Required";
+			break;
+		case 8:
+		case 9:
+			name = "Unassigned";
+			break;
+		case 10:
+			name = "Not assignable";
+			break;
+		case 11:
+			name = "Unassigned";
+			break;
+		case 12:
+		case 13:
+		case 14:
+		case 15:
+		case 16:
+		case 17:
+		case 18:
+		case 19:
+			name = "Not assignable";
+			break;
+		case 20:
+			name = "Automatic Identified Outward Dialing";
+			break;
+		case 21:
+		case 22:
+			name = "Unassigned";
+			break;
+		case 23:
+			name = "Coin or Non-Coin";
+			break;
+		case 24:
+		case 25:
+			name = "Toll Free Service translated to POTS";
+			break;
+		case 26:
+			name = "Unassigned";
+			break;
+		case 27:
+			name = "Pay Station using Coin Control Signalling";
+			break;
+		case 28:
+			name = "Unassigned";
+			break;
+		case 29:
+			name = "Prison/Inmate Service";
+			break;
+		case 30:
+		case 31:
+		case 32:
+			name = "Intercept";
+			break;
+		case 33:
+			name = "Unassigned";
+			break;
+		case 34:
+			name = "Telco Operator Handled Call";
+			break;
+		case 35:
+		case 36:
+		case 37:
+		case 38:
+		case 39:
+			name = "Unassigned";
+			break;
+		case 40:
+		case 41:
+		case 42:
+		case 43:
+		case 44:
+		case 45:
+		case 46:
+		case 47:
+		case 48:
+		case 49:
+			name = "Unrestricted Use - locally determined by carrier";
+			break;
+		case 50:
+		case 51:
+			name = "Unassigned";
+			break;
+		case 52:
+			name = "OUTWATS";
+			break;
+		case 53:
+		case 54:
+		case 55:
+		case 56:
+		case 57:
+		case 58:
+		case 59:
+			name = "Unassigned";
+			break;
+		case 60:
+			name = "TRS Unrestricted Line";
+			break;
+		case 61:
+			name = "Cellular Wireless PCS Type 1";
+			break;
+		case 62:
+			name = "Cellular Wireless PCS Type 2";
+			break;
+		case 63:
+			name = "Cellular Wireless PCS Roaming";
+			break;
+		case 64:
+		case 65:
+			name = "Unassigned";
+			break;
+		case 66:
+			name = "TRS Hotel Motel";
+			break;
+		case 67:
+			name = "TRS Restricted Line";
+			break;
+		case 68:
+		case 69:
+			name = "Unassigned";
+			break;
+		case 70:
+			name = "Pay Station No network Coin Control Signalling";
+			break;
+		case 71:
+		case 72:
+		case 73:
+		case 74:
+		case 75:
+		case 76:
+		case 77:
+		case 78:
+		case 79:
+			name = "Unassigned";
+			break;
+		case 80:
+		case 81:
+		case 82:
+		case 83:
+		case 84:
+		case 85:
+		case 86:
+		case 87:
+		case 88:
+		case 89:
+			name = "Reserved";
+			break;
+		case 90:
+		case 91:
+		case 92:
+			name = "Unassigned";
+			break;
+		case 93:
+			name = "Private Virtual Network Type of service call";
+			break;
+		case 94:
+		case 95:
+		case 96:
+		case 97:
+		case 98:
+		case 99:
+			name = "Unassigned";
+			break;
+
+		default:
+			name = "Unknown to Asterisk ";
 	}
 	ss7_message(ss7, "\t\t\tLine info code: %s\n", name);
 	ss7_message(ss7, "\t\t\tValue: %d\n", parm[0]);
 
-
-	return 1;
-	
+	return 1;
 }
 
 static FUNC_RECV(originating_line_information_receive) 
 {
+	c->oli_ani2 = parm[0];
+	c->oli_present = -1; 	/* Setting this to -1 . To keep track and put back if OLI is left untouched in dialplan */
+
 	return 1;
 }
 
 static FUNC_SEND(originating_line_information_transmit) 
 {
-	parm[0] = 0x00;  /* This value is setting OLI equal to POTS line. */
-	return 1;	 /*  Will want to have this be set in SIP.conf or thru dialplan and passed here */
-}
-
+	if (c->oli_present == 0 || c->oli_ani2 < 0) {  /* Allow dialplan to strip OLI parm if you don't want to resend what was received */
+		return 0;}
+	else if (c->oli_ani2 < 99) {
+		parm[0] = c->oli_ani2;  
+		return 1;
+	} else {
+		parm[0] = 0x00; /* This value is setting OLI equal to POTS line. */
+		return 1;
+	}   
+}
 
 static FUNC_DUMP(carrier_identification_dump)
 {
@@ -973,7 +982,7 @@
 	parm[0] = 0x22;  /* 4 digit CIC */
 	parm[1] = 0x00;  /* would send default 0000 */
 	parm[2] = 0x00;
-	
+
 	return 3;
 }
 
@@ -995,6 +1004,13 @@
 
 static FUNC_RECV(charge_number_receive)
 {
+	int oddeven = (parm[0] >> 7) & 0x1;
+
+	isup_get_number(c->charge_number, &parm[2], len - 2, oddeven);
+
+	c->charge_nai = parm[0] & 0x7f;                /* Nature of Address Indicator */
+	c->charge_num_plan = (parm[1] >> 4) & 0x7;
+
 	return len;
 }
 
@@ -1014,18 +1030,18 @@
 	return len;
 }
 
-static FUNC_SEND(charge_number_transmit)
-{
-       int oddeven, datalen;
-
-	if (!c->calling_party_num[0] || strlen(c->calling_party_num) != 10)  /* check to make sure we have 10 digit callerid to put in charge number */
+static FUNC_SEND(charge_number_transmit)  //ANSI network
+{
+	int oddeven, datalen;
+
+	if (!c->charge_number[0]  || strlen(c->charge_number) != 10)  /* check to make sure we have 10 digit callerid to put in charge number */
 		return 0;
 
-	isup_put_number(&parm[2], c->calling_party_num, &datalen, &oddeven);  /* use the value from callerid in sip.conf to fill charge number */
-										     
-	parm[0] = (oddeven << 7) | 0x1;        /* Nature of Address Indicator = odd/even and ANI of the Calling party, subscriber number */
-	parm[1] = (1 << 4) | 0x0;           /* Assume E.164 ISDN numbering plan, calling number complete and make sure reserved bits are zero */
-	    
+	isup_put_number(&parm[2], c->charge_number, &datalen, &oddeven);  /* use the value from callerid in sip.conf to fill charge number */
+
+	parm[0] = (oddeven << 7) | c->charge_nai;        /* Nature of Address Indicator = odd/even and ANI of the Calling party, subscriber number */
+	parm[1] = (1 << 4) | 0x0;       //c->charge_num_plan    /* Assume E.164 ISDN numbering plan, calling number complete and make sure reserved bits are zero */
+
 	return datalen + 2;
 
 }
@@ -1220,24 +1236,39 @@
 
 void isup_set_called(struct isup_call *c, const char *called, unsigned char called_nai, const struct ss7 *ss7)
 {
-    if (called && called[0]) {
-    	if (ss7->switchtype == SS7_ITU)
-    		snprintf(c->called_party_num, sizeof(c->called_party_num), "%s#", called);
-    	else
-    		snprintf(c->called_party_num, sizeof(c->called_party_num), "%s", called);
-	c->called_nai = called_nai;
-    }
-    
+	if (called && called[0]) {
+		if (ss7->switchtype == SS7_ITU)
+			snprintf(c->called_party_num, sizeof(c->called_party_num), "%s#", called);
+		else
+			snprintf(c->called_party_num, sizeof(c->called_party_num), "%s", called);
+		c->called_nai = called_nai;
+	}
+
+}
+
+void isup_set_oli(struct isup_call *c, unsigned int oli_ani2, unsigned int oli_present)
+{
+	c->oli_ani2 = oli_ani2;
+	c->oli_present = oli_present;
 }
 
 void isup_set_calling(struct isup_call *c, const char *calling, unsigned char calling_nai, unsigned char presentation_ind, unsigned char screening_ind)
 {
-    if (calling && calling[0]) {
-    	strncpy(c->calling_party_num, calling, sizeof(c->calling_party_num));
-	c->calling_nai = calling_nai;
-	c->presentation_ind = presentation_ind;
-	c->screening_ind = screening_ind;
-    }
+	if (calling && calling[0]) {
+		strncpy(c->calling_party_num, calling, sizeof(c->calling_party_num));
+		c->calling_nai = calling_nai;
+		c->presentation_ind = presentation_ind;
+		c->screening_ind = screening_ind;
+	}
+}
+
+void isup_set_charge(struct isup_call *c, const char *charge, unsigned char charge_nai, unsigned char charge_num_plan)
+{
+	if (charge && charge[0]) {
+		strncpy(c->charge_number, charge, sizeof(c->charge_number));
+		c->charge_nai = charge_nai;
+		c->charge_num_plan = charge_num_plan;
+	}
 }
 
 void isup_init_call(struct ss7 *ss7, struct isup_call *c, int cic, unsigned int dpc)
@@ -1450,7 +1481,7 @@
 	for (x = 0; x < sizeof(messages)/sizeof(struct message_data); x++)
 		if (messages[x].messagetype == messagetype)
 			ourmessage = x;
-			
+
 	if (ourmessage < 0) {
 		ss7_error(ss7, "Unable to find message %d in message list!\n", mh->type);
 		return -1;
@@ -1515,7 +1546,7 @@
 		while (parms[x] > -1) {
 			res = do_parm(ss7, c, mh->type, parms[x], (void *)(mh->data + offset), len, PARM_TYPE_OPTIONAL, 1);
 			x++;
-	
+
 			if (res < 0) {
 				ss7_error(ss7, "!! Unable to add optional parameter '%s'\n", param2str(parms[x]));
 				return -1;
@@ -1523,7 +1554,7 @@
 
 			if (res > 0)
 				addedparms++;
-	
+
 			len -= res;
 			offset += res;
 		}
@@ -1668,6 +1699,7 @@
 	unsigned char *opt_ptr = NULL;
 	ss7_event *e;
 
+
 	mh = (struct isup_h*) buf;
 	if (ss7->switchtype == SS7_ITU) {
 		cic = mh->cic[0] | ((mh->cic[1] << 8) & 0x0f);
@@ -1698,7 +1730,6 @@
 			fixedparams = 3;
 			varparams = 2;
 			parms = ansi_iam_params;
-				
 		} else if (messages[ourmessage].messagetype == ISUP_RLC) {
 			optparams = 0;
 		}
@@ -1716,6 +1747,8 @@
 		case ISUP_CGUA:
 		case ISUP_CGU:
 		case ISUP_UCIC:
+		case ISUP_LPA:
+		case ISUP_CCR:
 			c = __isup_new_call(ss7, 1);
 			c->dpc = opc;
 			c->cic = cic;
@@ -1799,6 +1832,11 @@
 			e->iam.calling_nai = c->calling_nai;
 			e->iam.presentation_ind = c->presentation_ind;
 			e->iam.screening_ind = c->screening_ind;
+			strncpy(e->iam.charge_number, c->charge_number, sizeof(e->iam.charge_number));
+			e->iam.charge_nai = c->charge_nai;
+			e->iam.charge_num_plan = c->charge_num_plan;
+			e->iam.oli_ani2 = c->oli_ani2;
+			e->iam.oli_present = c->oli_present;
 			e->iam.call = c;
 			return 0;
 		case ISUP_GRS:
@@ -1856,6 +1894,7 @@
 		case ISUP_CCR:
 			e->e = ISUP_EVENT_CCR;
 			e->ccr.cic = c->cic;
+			isup_free_call(ss7, c);
 			return 0;
 		case ISUP_BLO:
 			e->e = ISUP_EVENT_BLO;
@@ -1870,6 +1909,11 @@
 		case ISUP_BLA:
 			e->e = ISUP_EVENT_BLA;
 			e->bla.cic = c->cic;
+			isup_free_call(ss7, c);
+			return 0;
+		case ISUP_LPA:
+			e->e = ISUP_EVENT_LPA;
+			e->lpa.cic = c->cic;
 			isup_free_call(ss7, c);
 			return 0;
 		case ISUP_UBA:
@@ -1960,7 +2004,7 @@
 	call.cic = begincic;
 	call.range = endcic - begincic;
 	call.dpc = dpc;
-	
+
 	if (call.range > 31)
 		return -1;
 
@@ -1972,7 +2016,7 @@
 	if (!ss7)
 		return -1;
 
- 	return isup_send_cicgroupmessage(ss7, ISUP_CGB, begincic, endcic, dpc, state, type);
+	return isup_send_cicgroupmessage(ss7, ISUP_CGB, begincic, endcic, dpc, state, type);
 }
 
 int isup_cgu(struct ss7 *ss7, int begincic, int endcic, unsigned int dpc, unsigned char state[], int type)
@@ -1980,14 +2024,14 @@
 	if (!ss7)
 		return -1;
 
- 	return isup_send_cicgroupmessage(ss7, ISUP_CGU, begincic, endcic, dpc, state, type);
+	return isup_send_cicgroupmessage(ss7, ISUP_CGU, begincic, endcic, dpc, state, type);
 }
 
 int isup_cgba(struct ss7 *ss7, int begincic, int endcic, unsigned int dpc, unsigned char state[], int type)
 {
 	if (!ss7)
 		return -1;
- 	return isup_send_cicgroupmessage(ss7, ISUP_CGBA, begincic, endcic, dpc, state, type);
+	return isup_send_cicgroupmessage(ss7, ISUP_CGBA, begincic, endcic, dpc, state, type);
 }
 
 int isup_cgua(struct ss7 *ss7, int begincic, int endcic, unsigned int dpc, unsigned char state[], int type)
@@ -2110,6 +2154,14 @@
 	return isup_send_message_ciconly(ss7, ISUP_BLA, cic, dpc);
 }
 
+int isup_lpa(struct ss7 *ss7, int cic, unsigned int dpc)
+{
+	if (!ss7)
+		return -1;
+
+	return isup_send_message_ciconly(ss7, ISUP_LPA, cic, dpc);
+}
+
 int isup_ucic(struct ss7 *ss7, int cic, unsigned int dpc)
 {
 	if (!ss7)
@@ -2118,7 +2170,6 @@
 	return isup_send_message_ciconly(ss7, ISUP_UCIC, cic, dpc);
 }
 
-
 int isup_uba(struct ss7 *ss7, int cic, unsigned int dpc)
 {
 	if (!ss7)

Modified: trunk/isup.h
URL: http://svn.digium.com/view/libss7/trunk/isup.h?view=diff&rev=116&r1=115&r2=116
==============================================================================
--- trunk/isup.h (original)
+++ trunk/isup.h Thu Oct 11 15:10:26 2007
@@ -129,6 +129,11 @@
 	unsigned char calling_nai;
 	unsigned char presentation_ind;
 	unsigned char screening_ind;
+	char charge_number[ISUP_MAX_NUM];
+	unsigned char charge_nai;
+	unsigned char charge_num_plan;
+	int oli_ani2;
+	int oli_present;
 	int range;
 	unsigned char status[255];
 	int transcap;

Modified: trunk/libss7.h
URL: http://svn.digium.com/view/libss7/trunk/libss7.h?view=diff&rev=116&r1=115&r2=116
==============================================================================
--- trunk/libss7.h (original)
+++ trunk/libss7.h Thu Oct 11 15:10:26 2007
@@ -41,6 +41,7 @@
 #define ISUP_EVENT_RSC		21
 #define ISUP_EVENT_CPG		22
 #define ISUP_EVENT_UCIC		23
+#define ISUP_EVENT_LPA 		24
 
 /* Different SS7 types */
 #define SS7_ITU		(1 << 0)
@@ -58,10 +59,18 @@
 #define SS7_NI_NAT_SPARE		0x03
 
 /* Nature of Address Indicator */
-#define SS7_NAI_SUBSCRIBER             0x01
-#define SS7_NAI_UNKNOWN                0x02
-#define SS7_NAI_NATIONAL               0x03
-#define SS7_NAI_INTERNATIONAL          0x04
+#define SS7_NAI_SUBSCRIBER             	0x01
+#define SS7_NAI_UNKNOWN			0x02
+#define SS7_NAI_NATIONAL               	0x03
+#define SS7_NAI_INTERNATIONAL          	0x04
+
+/* Charge Number Nature of Address Indicator ANSI */
+#define SS7_ANI_CALLING_PARTY_SUB_NUMBER			0x01	/* ANI of the calling party; subscriber number */
+#define SS7_ANI_NOTAVAIL_OR_NOTPROVIDED				0x02	/* ANI not available or not provided */
+#define SS7_ANI_CALLING_PARTY_NATIONAL_NUMBER			0x03	/* ANI of the calling party; national number */
+#define SS7_ANI_CALLED_PARTY_SUB_NUMBER				0x05	/* ANI of the called party; subscriber number */
+#define SS7_ANI_CALLED_PARTY_NOT_PRESENT  			0x06	/* ANI of the called party; no number present */
+#define SS7_ANI_CALLED_PARTY_NATIONAL_NUMBER 			0x07	/* ANT of the called patty; national number */
 
 /* Address Presentation */
 #define SS7_PRESENTATION_ALLOWED                       0x00
@@ -96,6 +105,11 @@
 	unsigned char calling_nai;
 	unsigned char presentation_ind;
 	unsigned char screening_ind;
+	char charge_number[50];
+	unsigned char charge_nai;
+	unsigned char charge_num_plan;
+	int oli_ani2;
+	int oli_present;
 	struct isup_call *call;
 } ss7_event_iam;
 
@@ -185,6 +199,7 @@
 	ss7_event_ciconly ucic;
 	ss7_event_rsc rsc;
 	ss7_event_cpg cpg;
+	ss7_event_ciconly lpa;
 } ss7_event;
 
 void ss7_set_message(void (*func)(struct ss7 *ss7, char *message));
@@ -244,6 +259,8 @@
 
 int isup_cpg(struct ss7 *ss7, struct isup_call *c, int event);
 
+int isup_lpa(struct ss7 *ss7, int cic, unsigned int dpc);
+
 int isup_gra(struct ss7 *ss7, int begincic, int endcic, unsigned int dpc);
 
 int isup_grs(struct ss7 *ss7, int begincic, int endcic, unsigned int dpc);
@@ -260,6 +277,8 @@
 
 int isup_ubl(struct ss7 *ss7, int cic, unsigned int dpc);
 
+int isup_ccr(struct ss7 *ss7, int cic, unsigned int dpc);
+
 int isup_bla(struct ss7 *ss7, int cic, unsigned int dpc);
 
 int isup_ucic(struct ss7 *ss7, int cic, unsigned int dpc);
@@ -276,4 +295,8 @@
 
 void isup_set_calling(struct isup_call *c, const char *calling, unsigned char calling_nai, unsigned char presentation_ind, unsigned char screening_ind);
 
+void isup_set_charge(struct isup_call *c, const char *charge, unsigned char charge_nai, unsigned char charge_num_plan);
+
+void isup_set_oli(struct isup_call *c, unsigned int oli_ani2, unsigned int oli_present);
+
 #endif /* _LIBSS7_H */




More information about the libss7-commits mailing list