[PATCH] adds ack/nack bbox<->smsbox

Alexander Malysh <[email protected]>
Newsgroups gmane.comp.mobile.kannel.devel
Organization Centrium GmbH
Message-ID <[email protected]>
Hi,

attached patch adds ack/nack support in communication between bearerbox and 
smsbox. This patch implement only bearerbox part , because we don't use 
smsbox... With this patch smsbox will allways receive "really" status of sms 
(e.g. buffered/success/failed) so smsbox can forward received status to the 
user.

Comments and votes are welcom...

-- 
Best Regards / Mit besten Grüßen aus Köln

Dipl.-Ing.
Alexander Malysh
___________________________________

Centrium GmbH
Ehrenstrasse 2
50672 Köln

Fon: +49 (0221) 277 49 240
Fax: +49 (0221) 277 49 109

email: [email protected]
web: http://www.centrium.de
msn: [email protected]
ack_nack_bbbox_smsbox.diff (text/x-diff, 5 KB)
Index: gw/bb_boxc.c
===================================================================
RCS file: /home/cvs/gateway/gw/bb_boxc.c,v
retrieving revision 1.63
diff -a -u -r1.63 bb_boxc.c
--- gw/bb_boxc.c	4 Mar 2003 14:43:51 -0000	1.63
+++ gw/bb_boxc.c	9 Mar 2003 19:24:22 -0000
@@ -122,6 +122,55 @@
 }
 
 
+/*
+ * Try deliver sms to internal or smscconn queue
+ * and generate ack/nack for smsbox.
+ */
+static void deliver_sms_to_queue(Msg *msg, Boxc *conn)
+{
+    Msg *mack, *mack_store;
+    int rc;
+
+    /* 
+     * save modifies ID and time , so if the smsbox uses it, save
+     * it FIRST for the reply message!!! 
+     */
+    mack = msg_create(ack);
+    gw_assert(mack != NULL);
+    mack->ack.id = msg->sms.id;
+    mack->ack.time = msg->sms.time;
+    store_save(msg);
+    rc = smsc2_rout(msg);
+    switch(rc) {
+        case 1:
+           mack->ack.nack = ack_success;
+           break;
+        case 0:
+           mack->ack.nack = ack_buffered;
+           break;
+        case -1:
+           warning(0, "Message rejected by bearerbox, no router!");
+           /* 
+            * first create nack for store-file, in order to delete
+            * message from store-file.
+            */
+            mack_store = msg_create(ack);
+            gw_assert(mack_store != NULL);
+            mack_store->ack.id = msg->sms.id;
+            mack_store->ack.time = msg->sms.time;
+            mack_store->ack.nack = ack_failed;
+            store_save(mack_store);
+            msg_destroy(mack_store);
+            /* now set nack for smsbox */
+            mack->ack.nack = ack_failed;
+            /* destroy original message */
+            msg_destroy(msg);
+            break;
+    }
+    /* put ack into incoming queue */
+    list_produce(conn->incoming, mack);
+}
+
 static void boxc_receiver(void *arg)
 {
     Boxc *conn = arg;
@@ -141,25 +190,7 @@
 
         if (msg_type(msg) == sms && conn->is_wap == 0) {
             debug("bb.boxc", 0, "boxc_receiver: sms received");
-
-            /* 
-             * XXX save modifies ID, so if the smsbox uses it, save
-             * it FIRST for the reply message!!! 
-             */
-            store_save(msg);
-            if (smsc2_rout(msg)== -1) {
-                warning(0, "Message rejected by bearerbox, no router!");
-                /* send NACK */
-                bb_smscconn_send_failed(NULL, msg, SMSCCONN_FAILED_DISCARDED);
-            }
-            if (msg->sms.sms_type == mt_push) {
-                /* 
-                 * XXX generate ack-message and send it - in fact, this
-                 * should include information did it succeed, wa sit queued
-                 * or rejected... 
-                 */
-            }
-
+            deliver_sms_to_queue(msg, conn);
         } else if (msg_type(msg) == wdp_datagram  && conn->is_wap) {
             debug("bb.boxc", 0, "boxc_receiver: got wdp from wapbox");
             
@@ -168,6 +199,7 @@
         } else if (msg_type(msg) == sms  && conn->is_wap) {
             debug("bb.boxc", 0, "boxc_receiver: got sms from wapbox");
 
+            /* XXX should we call derive_sms_to_queue here too ??? */
             store_save(msg);
             if (smsc2_rout(msg)== -1) {
                 warning(0, "Message rejected by bearerbox, no router!");
Index: gw/bb_smscconn.c
===================================================================
RCS file: /home/cvs/gateway/gw/bb_smscconn.c,v
retrieving revision 1.56
diff -a -u -r1.56 bb_smscconn.c
--- gw/bb_smscconn.c	3 Dec 2002 00:24:17 -0000	1.56
+++ gw/bb_smscconn.c	9 Mar 2003 19:24:23 -0000
@@ -130,7 +130,7 @@
     /* write ACK to store file */
 
     mack = msg_create(ack);
-    mack->ack.nack = 0;
+    mack->ack.nack = ack_success;
     mack->ack.time = sms->sms.time;
     mack->ack.id = sms->sms.id;
     
@@ -159,7 +159,7 @@
 	/* write NACK to store file */
 
 	mnack = msg_create(ack);
-	mnack->ack.nack = 1;
+	mnack->ack.nack = ack_failed;
 	mnack->ack.time = sms->sms.time;
 	mnack->ack.id = sms->sms.id;
 
Index: gw/msg.h
===================================================================
RCS file: /home/cvs/gateway/gw/msg.h,v
retrieving revision 1.13
diff -a -u -r1.13 msg.h
--- gw/msg.h	14 Nov 2002 02:29:25 -0000	1.13
+++ gw/msg.h	9 Mar 2003 19:24:23 -0000
@@ -47,6 +47,14 @@
     cmd_identify = 3
 };
 
+/* ack message status */
+enum {
+    ack_success = 0,
+    ack_failed = 1, /* do not try again (e.g. no route) */
+    ack_failed_tmp = 2, /* temporary failed , try again (e.g. queue full)*/
+    ack_buffered = 3
+};
+
 /*
  * Create a new, empty Msg object. Panics if fails.
  */
Index: gw/smsbox.c
===================================================================
RCS file: /home/cvs/gateway/gw/smsbox.c,v
retrieving revision 1.218
diff -a -u -r1.218 smsbox.c
--- gw/smsbox.c	4 Mar 2003 15:16:08 -0000	1.218
+++ gw/smsbox.c	9 Mar 2003 19:24:29 -0000
@@ -1485,7 +1485,7 @@
 	/* create reply message to be sent afterwards */
 
 	reply_msg = msg_create(ack);
-	reply_msg->ack.nack = 0;
+	reply_msg->ack.nack = ack_success;
 	reply_msg->ack.time = msg->sms.time;
 	reply_msg->ack.id = msg->sms.id;
smime.p7s (application/pkcs7-signature, 2.5 KB) - not displayed
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.