[libss7-commits] mattf: trunk r88 - in /trunk: README isup.c isup.h libss7.h ss7linktest.c

SVN commits to the libss7 project libss7-commits at lists.digium.com
Tue Jun 19 09:49:17 CDT 2007


Author: mattf
Date: Tue Jun 19 09:49:16 2007
New Revision: 88

URL: http://svn.digium.com/view/libss7?view=rev&rev=88
Log:
Add support for nature of address indicator, number presentation, and screening indicator (#10000)

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

Modified: trunk/README
URL: http://svn.digium.com/view/libss7/trunk/README?view=diff&rev=88&r1=87&r2=88
==============================================================================
--- trunk/README (original)
+++ trunk/README Tue Jun 19 09:49:16 2007
@@ -1,6 +1,5 @@
 libss7:
 =======
-
 libss7 is a userspace library that is used for providing SS7 protocol
 services to applications.  It has a working MTP2, MTP3, and ISUP for
 ITU and ANSI style SS7, however it was written in a manner that will easily
@@ -17,7 +16,7 @@
 ================
 Siemens EWSD - (ITU style) MTP2 and MTP3 comes up, ISUP inbound and outbound calls work as well.
 DTI DXC 4K - (ANSI style) 56kbps link, MTP2 and MTP3 come up, ISUP inbound and outbound calls work as well.
-
+Huawei M800 - (ITU style) MTP2 and MTP3 comes up, ISUP National, International inbound and outbound calls work as well, CallerID presentation&screening work.
 
 Thanks:
 =======
@@ -53,13 +52,13 @@
 ANSI MTP2, MTP3, and ISUP, inbound and outbound calling works now.
 ITU style SS7 support
 ANSI-style signalling support
+Called and Calling Nature of Address Indicator
+CallerID presentation&screening
 
 TODO:
 =====
-
 short term:
 SUS/RES
-CallerID presentation
 RDNIS
 Timer for last SU received so we know if layer2 goes out under us
 

Modified: trunk/isup.c
URL: http://svn.digium.com/view/libss7/trunk/isup.c?view=diff&rev=88&r1=87&r2=88
==============================================================================
--- trunk/isup.c (original)
+++ trunk/isup.c Tue Jun 19 09:49:16 2007
@@ -322,8 +322,7 @@
 	
 static FUNC_SEND(calling_party_cat_transmit)
 {
-	/* Default to unknown */
-	parm[0] = 0x0a;
+	parm[0] = 0x0a; /* Default to Ordinary calling subscriber */
 	return 1;
 }
 
@@ -380,6 +379,8 @@
 	
 	isup_get_number(c->called_party_num, &parm[2], len - 2, odd);
 
+	c->called_nai = parm[0] & 0x7f; /* Nature of Address Indicator */
+
 	return len;
 }
 
@@ -389,12 +390,12 @@
 
 	isup_put_number(&parm[2], c->called_party_num, &numlen, &oddeven);
 
-	parm[0] = 0x03; /* Assume unknown */
+	parm[0] = c->called_nai & 0x7f; /* Nature of Address Indicator */
 	
 	if (oddeven)
 		parm[0] |= 0x80; /* Odd number of digits */
 
-	parm[1] = (0x1 << 4) | 0x00; /* Assume E.164 numbering plan */
+	parm[1] = 0x1 << 4; /* Assume E.164 ISDN numbering plan, called number complete  */
 
 	return numlen + 2;
 }
@@ -520,6 +521,10 @@
 
 	isup_get_number(c->calling_party_num, &parm[2], len - 2, oddeven);
 
+	c->calling_nai = parm[0] & 0x7f;                /* Nature of Address Indicator */
+	c->presentation_ind = (parm[1] >> 2) & 0x3;
+	c->screening_ind = parm[1] & 0x3;
+
 	return len;
 }
 
@@ -532,8 +537,10 @@
 
 	isup_put_number(&parm[2], c->calling_party_num, &datalen, &oddeven);
 
-	parm[0] = (oddeven << 7) | 0x3;
-	parm[1] = 0x11;
+	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);
 
 	return datalen + 2;
 }
@@ -681,6 +688,8 @@
 	{ISUP_PARM_CIRCUIT_GROUP_SUPERVISION_IND, "Circuit Group Supervision Indicator", circuit_group_supervision_dump, circuit_group_supervision_receive, circuit_group_supervision_transmit},
 	{ISUP_PARM_RANGE_AND_STATUS, "Range and status", range_and_status_dump, range_and_status_receive, range_and_status_transmit},
 	{ISUP_PARM_EVENT_INFO, "Event Information", event_info_dump, event_info_receive, event_info_transmit},
+	{ISUP_PARM_OPT_FORWARD_CALL_INDICATOR, "Optional forward call indicator"},
+	{ISUP_PARM_LOCATION_NUMBER, "Location Number"},
 };
 
 static char * param2str(int parm)
@@ -726,20 +735,32 @@
 	c->dpc = dpc;
 }
 
-void isup_init_call(struct ss7 *ss7, struct isup_call *c, int cic, unsigned int dpc, char *calledpartynum, char *callingpartynum)
+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;
+    }
+    
+}
+
+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;
+    }
+}
+
+void isup_init_call(struct ss7 *ss7, struct isup_call *c, int cic, unsigned int dpc)
 {
 	c->cic = cic;
 	c->dpc = dpc;
-	if (calledpartynum && calledpartynum[0]) {
-		if (ss7->switchtype == SS7_ITU)
-			snprintf(c->called_party_num, sizeof(c->called_party_num), "%s#", calledpartynum);
-		else
-			snprintf(c->called_party_num, sizeof(c->called_party_num), "%s", calledpartynum);
-	}
-
-	if (callingpartynum && callingpartynum[0])
-		strncpy(c->calling_party_num, callingpartynum, sizeof(c->calling_party_num));
-
 }
 
 static struct isup_call * isup_find_call(struct ss7 *ss7, int cic)
@@ -1262,7 +1283,11 @@
 			e->iam.transcap = c->transcap;
 			e->iam.cot_check_required = c->cot_check_required;
 			strncpy(e->iam.called_party_num, c->called_party_num, sizeof(e->iam.called_party_num));
+			e->iam.called_nai = c->called_nai;
 			strncpy(e->iam.calling_party_num, c->calling_party_num, sizeof(e->iam.calling_party_num));
+			e->iam.calling_nai = c->calling_nai;
+			e->iam.presentation_ind = c->presentation_ind;
+			e->iam.screening_ind = c->screening_ind;
 			e->iam.call = c;
 			return 0;
 		case ISUP_GRS:

Modified: trunk/isup.h
URL: http://svn.digium.com/view/libss7/trunk/isup.h?view=diff&rev=88&r1=87&r2=88
==============================================================================
--- trunk/isup.h (original)
+++ trunk/isup.h Tue Jun 19 09:49:16 2007
@@ -100,6 +100,8 @@
 #define ISUP_PARM_PROPAGATION_DELAY 0x31
 #define ISUP_PARM_EVENT_INFO 0x24
 #define ISUP_PARM_HOP_COUNTER 0x3d
+#define ISUP_PARM_OPT_FORWARD_CALL_INDICATOR 0x08
+#define ISUP_PARM_LOCATION_NUMBER 0x3f
 
 /* ISUP Parameter Pseudo-type */
 struct isup_parm_opt {
@@ -121,10 +123,13 @@
 
 struct isup_call {
 	char called_party_num[ISUP_MAX_NUM];
+	unsigned char called_nai;
 	char calling_party_num[ISUP_MAX_NUM];
+	unsigned char calling_nai;
+	unsigned char presentation_ind;
+	unsigned char screening_ind;
 	int range;
 	unsigned char status[255];
-	int international;
 	int transcap;
 	int l1prot;
 	int cause;

Modified: trunk/libss7.h
URL: http://svn.digium.com/view/libss7/trunk/libss7.h?view=diff&rev=88&r1=87&r2=88
==============================================================================
--- trunk/libss7.h (original)
+++ trunk/libss7.h Tue Jun 19 09:49:16 2007
@@ -56,6 +56,23 @@
 #define SS7_NI_NAT			0x02
 #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
+
+/* Address Presentation */
+#define SS7_PRESENTATION_ALLOWED                       0x00
+#define SS7_PRESENTATION_RESTRICTED                    0x01
+#define SS7_PRESENTATION_ADDR_NOT_AVAILABLE            0x02
+
+/* Screening */
+#define SS7_SCREENING_USER_PROVIDED_NOT_VERIFIED       0x00
+#define SS7_SCREENING_USER_PROVIDED                    0x01
+#define SS7_SCREENING_NETWORK_PROVIDED_FAILED          0x02
+#define SS7_SCREENING_NETWORK_PROVIDED                 0x03
+
 /* CPG parameter types */
 #define CPG_EVENT_ALERTING	0x01
 #define CPG_EVENT_PROGRESS	0x02
@@ -73,7 +90,11 @@
 	int transcap;
 	int cot_check_required;
 	char called_party_num[50];
+	unsigned char called_nai;
 	char calling_party_num[50];
+	unsigned char calling_nai;
+	unsigned char presentation_ind;
+	unsigned char screening_ind;
 	struct isup_call *call;
 } ss7_event_iam;
 
@@ -201,6 +222,7 @@
 
 char * ss7_event2str(int event);
 
+
 /* ISUP call related message functions */
 
 /* Send an IAM */
@@ -242,7 +264,12 @@
 
 int isup_rsc(struct ss7 *ss7, int cic, unsigned int dpc);
 
-void isup_init_call(struct ss7 *ss7, struct isup_call *c, int cic, unsigned int dpc, char *calledpartynum, char *callingpartynum);
+void isup_init_call(struct ss7 *ss7, struct isup_call *c, int cic, unsigned int dpc);
 
 void isup_set_call_dpc(struct isup_call *c, unsigned int dpc);
+
+void isup_set_called(struct isup_call *c, const char *called, unsigned char called_nai, const struct ss7 *ss7);
+
+void isup_set_calling(struct isup_call *c, const char *calling, unsigned char calling_nai, unsigned char presentation_ind, unsigned char screening_ind);
+
 #endif /* _LIBSS7_H */

Modified: trunk/ss7linktest.c
URL: http://svn.digium.com/view/libss7/trunk/ss7linktest.c?view=diff&rev=88&r1=87&r2=88
==============================================================================
--- trunk/ss7linktest.c (original)
+++ trunk/ss7linktest.c Tue Jun 19 09:49:16 2007
@@ -34,7 +34,9 @@
 	c = isup_new_call(ss7);
 
 	if (c) {
-		isup_init_call(ss7, c, (callcount % 12) + 1, dpc, "12345", "7654321");
+		isup_set_called(c, "12345", SS7_NAI_NATIONAL, ss7);
+		isup_set_calling(c, "7654321", SS7_NAI_NATIONAL, SS7_PRESENTATION_ALLOWED, SS7_SCREENING_USER_PROVIDED);
+		isup_init_call(ss7, c, (callcount % 12) + 1, dpc);
 		isup_iam(ss7, c);
 		printf("Callcount = %d\n ", ++callcount);
 	}




More information about the libss7-commits mailing list