Re: Patch: test/drive_smpp.c

"Nikos Balkanas" <[email protected]>
Newsgroups gmane.comp.mobile.kannel.devel
Message-ID <C12EE2D2A9334C729852D8AAF58CB764@drwho>
OOps!
----- Original Message ----- 
From: "Nikos Balkanas" <[email protected]>
To: <[email protected]>
Sent: Monday, June 28, 2010 5:33 PM
Subject: Patch: test/drive_smpp.c


> Hi,
>
> This is a patch to test/drive_smpp.c, which I found useful in SMPPbox 
> testing, since I do not have a real SMSc connection. It adds external SMS 
> submission along with concatenation, if SMS is too large.
>
> drive_smpp is a very nifty tool. It acts as a (FAKE) SMPP SMSc and smsbox 
> for MOs with a twist:
>
> drive_smpp->BB->drive_smpp
>
> This is a single instance of dive_smpp connected to bb both as an SMSc and 
> as an smsbox. It generates MOs over SMPP to bb, which are then processed 
> by BB to smsbox for an sms-service. Except that drive_smpp is connected as 
> an smsbox to receive it and provides a default sms-service "Hello World". 
> This in turn, is processed by bb back to drive_smpp(SMSc). All these are 
> logged and monitored and drive_smpp even provides for TLV testing/support.
>
> If it is accepted I will do an effort to write some documentation about 
> it.
>
> BR,
> Nikos
>
>
>
drive_smpp.diff (application/octet-stream, 4.2 KB)
Index: test/drive_smpp.c
===================================================================
--- test/drive_smpp.c	(revision 4833)
+++ test/drive_smpp.c	(working copy)
@@ -70,7 +70,11 @@
 #include "gw/smsc/smpp_pdu.h"
 #include "gw/msg.h"
 
+#define MAX_SMS_OCTETS 140
+#define CATENATE_UDH_LEN 5
 
+typedef unsigned char uchar;
+
 static int quitting = 0;
 static Octstr *smsc_system_id;
 static Octstr *smsc_source_addr;
@@ -89,6 +93,7 @@
 static time_t first_from_bb = (time_t) -1;
 static time_t last_to_bb = (time_t) -1;
 static long enquire_interval = 1; /* Measured in messages, not time. */
+static Octstr *SMS = NULL;
 
 
 static void quit(void)
@@ -249,11 +254,19 @@
     smpp_pdu_dump(pdu);
 }
 
+void load_deliver_pdu(SMPP_PDU *pdu, Octstr *data, ESME *esme)
+{
+	pdu->u.deliver_sm.source_addr = octstr_create("456");
+	pdu->u.deliver_sm.destination_addr = octstr_create("123");
+	pdu->u.deliver_sm.short_message = data;
+	if (esme->version > 0x33)
+		pdu->u.deliver_sm.receipted_message_id = octstr_create("receipted_message_id\0");
+}
 
 static void send_smpp_thread(void *arg)
 {
     ESME *esme;
-    Octstr *os;
+    Octstr *os, *data;
     SMPP_PDU *pdu;
     unsigned long id;
 
@@ -266,16 +279,59 @@
             gwthread_sleep(1.0);
         if (quitting)
             break;
-        pdu = smpp_pdu_create(deliver_sm, counter_increase(message_id_counter));
-        pdu->u.deliver_sm.source_addr = octstr_create("456");
-        pdu->u.deliver_sm.destination_addr = octstr_create("123");
-        pdu->u.deliver_sm.short_message = octstr_format("%ld", id);
-        if (esme->version > 0x33)
-            pdu->u.deliver_sm.receipted_message_id = octstr_create("receipted_message_id\0");
-        os = smpp_pdu_pack(NULL, pdu);
-        conn_write(esme->conn, os);
-        octstr_destroy(os);
-        smpp_pdu_destroy(pdu);
+			if (SMS)
+			{
+				if (octstr_len(SMS) <= (MAX_SMS_OCTETS * 8)/7)
+				{
+					data = octstr_duplicate(SMS);
+					goto single;
+				}
+				else
+				{
+					uchar	*start = octstr_get_cstr(SMS), *p = start, *end, c;
+					int	len = octstr_len(SMS), part = 0, num_msgs, part_len;
+
+					part_len = (MAX_SMS_OCTETS - CATENATE_UDH_LEN - 1) *8/7;
+					num_msgs = len/part_len;
+					if (len%part_len) num_msgs++;
+					while (start - p < len)
+					{
+						part++;
+						end = start + part_len;
+						if (end < p + len)
+						{
+							c = *end;
+							*end = '\0';
+						}
+						else end = p + len;
+						data = octstr_format("%c%c\3\xAF%c%c", CATENATE_UDH_LEN, 0,
+							num_msgs, part);
+						octstr_append_data(data, start, end - start);
+						if (end < p + len) *end = c;
+						pdu = smpp_pdu_create(deliver_sm, counter_increase
+							(message_id_counter));
+						load_deliver_pdu(pdu, data, esme);
+						pdu->u.deliver_sm.esm_class = pdu->u.deliver_sm.esm_class |
+							ESM_CLASS_DELIVER_UDH_INDICATOR;
+						os = smpp_pdu_pack(NULL, pdu);
+						conn_write(esme->conn, os);
+						octstr_destroy(os);
+						smpp_pdu_destroy(pdu);
+						start = end;
+					}
+				}
+			} // NIKOS!!!
+			else
+			{
+				data = octstr_format("%ld", id);
+single:		pdu = smpp_pdu_create(deliver_sm, counter_increase
+					(message_id_counter));
+				load_deliver_pdu(pdu, data, esme);
+				os = smpp_pdu_pack(NULL, pdu);
+				conn_write(esme->conn, os);
+				octstr_destroy(os);
+				smpp_pdu_destroy(pdu);
+			}
         if (first_to_esme == (time_t) -1)
             time(&first_to_esme);
         debug("test.smpp", 0, "Delivered SMS %ld of %ld to bearerbox via SMPP.",
@@ -459,7 +515,7 @@
 
 static void help(void)
 {
-    info(0, "drive_smpp [-h] [-v level][-l logfile][-p port][-m msgs][-c config]");
+    info(0, "drive_smpp [-h] [-v level][-l logfile][-p port][-P http_port][-M SMS][-m msgs][-c config]");
 }
 
 
@@ -495,7 +551,7 @@
     num_from_bearerbox = counter_create();
     log_file = config_file = NULL;
 
-    while ((opt = getopt(argc, argv, "hv:p:P:m:l:c:")) != EOF) {
+    while ((opt = getopt(argc, argv, "hv:p:P:M:m:l:c:")) != EOF) {
 	switch (opt) {
 	case 'v':
 	    log_set_output_level(atoi(optarg));
@@ -509,6 +565,10 @@
 	    max_to_esme = atoi(optarg);
 	    break;
 
+	case 'M':
+	    SMS = octstr_create(optarg);
+	    break;
+
 	case 'p':
 	    port = atoi(optarg);
 	    break;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.