summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <holger@moiji-mobile.com>2014-02-08 15:20:48 +0100
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2014-02-20 11:35:56 +0100
commitca114432be6c9e108f0f3182c564d264b78669e0 (patch)
tree72b76cab760993bd27025885883854264a1147e4
parent6ab5d4f861c05ef57cde423cf2ddf0699940b4fc (diff)
sms: Increment the RP Message Reference for each transaction
Each RP-DATA should have a unique msg reference. Currently 42 is used for all of these. Remember the last reference we used and increment it on the next SMS. Do not track if the reference is still in use a clash is a lot less likely now. First unless SMPP is used only one SMS is delivered at a time, second the transaction space is a lot smaller than the one for the reference.
-rw-r--r--openbsc/include/openbsc/gsm_04_11.h2
-rw-r--r--openbsc/include/openbsc/gsm_data.h2
-rw-r--r--openbsc/src/libmsc/Makefile.am3
-rw-r--r--openbsc/src/libmsc/gsm_04_11.c4
-rw-r--r--openbsc/src/libmsc/gsm_04_11_helper.c37
-rw-r--r--openbsc/tests/gsm0408/gsm0408_test.c25
-rw-r--r--openbsc/tests/gsm0408/gsm0408_test.ok4
7 files changed, 74 insertions, 3 deletions
diff --git a/openbsc/include/openbsc/gsm_04_11.h b/openbsc/include/openbsc/gsm_04_11.h
index 72b694825..00c3a19fa 100644
--- a/openbsc/include/openbsc/gsm_04_11.h
+++ b/openbsc/include/openbsc/gsm_04_11.h
@@ -37,4 +37,6 @@ int gsm411_send_sms_subscr(struct gsm_subscriber *subscr,
int gsm411_send_sms(struct gsm_subscriber_connection *conn,
struct gsm_sms *sms);
void gsm411_sapi_n_reject(struct gsm_subscriber_connection *conn);
+
+uint8_t sms_next_rp_msg_ref(struct gsm_subscriber_connection *conn);
#endif
diff --git a/openbsc/include/openbsc/gsm_data.h b/openbsc/include/openbsc/gsm_data.h
index 41fe3281f..404dfe444 100644
--- a/openbsc/include/openbsc/gsm_data.h
+++ b/openbsc/include/openbsc/gsm_data.h
@@ -106,6 +106,8 @@ struct gsm_subscriber_connection {
/* LU expiration handling */
uint8_t expire_timer_stopped;
+ /* SMS helpers for libmsc */
+ uint8_t next_rp_ref;
/*
* Operations that have a state and might be pending
diff --git a/openbsc/src/libmsc/Makefile.am b/openbsc/src/libmsc/Makefile.am
index 2b5059986..1e58cd101 100644
--- a/openbsc/src/libmsc/Makefile.am
+++ b/openbsc/src/libmsc/Makefile.am
@@ -6,7 +6,8 @@ noinst_LIBRARIES = libmsc.a
libmsc_a_SOURCES = auth.c \
db.c \
- gsm_04_08.c gsm_04_11.c gsm_04_80.c \
+ gsm_04_08.c gsm_04_11.c gsm_04_11_helper.c \
+ gsm_04_80.c \
gsm_subscriber.c \
mncc.c mncc_builtin.c mncc_sock.c \
rrlp.c \
diff --git a/openbsc/src/libmsc/gsm_04_11.c b/openbsc/src/libmsc/gsm_04_11.c
index 97a67ee53..45e5dc5e9 100644
--- a/openbsc/src/libmsc/gsm_04_11.c
+++ b/openbsc/src/libmsc/gsm_04_11.c
@@ -450,7 +450,7 @@ static int gsm411_rp_sendmsg(struct gsm411_smr_inst *inst, struct msgb *msg,
rp = (struct gsm411_rp_hdr *)msgb_push(msg, sizeof(*rp));
rp->len = len + 2;
rp->msg_type = rp_msg_type;
- rp->msg_ref = rp_msg_ref; /* FIXME: Choose randomly */
+ rp->msg_ref = rp_msg_ref;
return gsm411_smr_send(inst, rl_msg_type, msg);
}
@@ -836,7 +836,7 @@ int gsm411_send_sms(struct gsm_subscriber_connection *conn, struct gsm_sms *sms)
struct msgb *msg = gsm411_msgb_alloc();
struct gsm_trans *trans;
uint8_t *data, *rp_ud_len;
- uint8_t msg_ref = 42;
+ uint8_t msg_ref = sms_next_rp_msg_ref(conn);
int transaction_id;
int rc;
diff --git a/openbsc/src/libmsc/gsm_04_11_helper.c b/openbsc/src/libmsc/gsm_04_11_helper.c
new file mode 100644
index 000000000..f48c6de0b
--- /dev/null
+++ b/openbsc/src/libmsc/gsm_04_11_helper.c
@@ -0,0 +1,37 @@
+/* Helpers for SMS/GSM 04.11 */
+/*
+ * (C) 2014 by Holger Hans Peter Freyther
+ *
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <openbsc/gsm_data.h>
+#include <openbsc/gsm_04_11.h>
+
+uint8_t sms_next_rp_msg_ref(struct gsm_subscriber_connection *conn)
+{
+ const uint8_t rp_msg_ref = conn->next_rp_ref;
+ /*
+ * This should wrap as the valid range is 0 to 255. We only
+ * transfer one SMS at a time so we don't need to check if
+ * the id has been already assigned.
+ */
+ conn->next_rp_ref += 1;
+
+ return rp_msg_ref;
+}
+
diff --git a/openbsc/tests/gsm0408/gsm0408_test.c b/openbsc/tests/gsm0408/gsm0408_test.c
index 38c1a6a8c..692ec90b0 100644
--- a/openbsc/tests/gsm0408/gsm0408_test.c
+++ b/openbsc/tests/gsm0408/gsm0408_test.c
@@ -25,6 +25,7 @@
#include <arpa/inet.h>
#include <openbsc/gsm_04_08.h>
+#include <openbsc/gsm_04_11.h>
#include <openbsc/gsm_subscriber.h>
#include <openbsc/debug.h>
#include <openbsc/arfcn_range_encode.h>
@@ -448,6 +449,29 @@ static void test_si_range_helpers()
VERIFY(f0, ==, 1);
}
+static void test_gsm411_rp_ref_wrap(void)
+{
+ struct gsm_subscriber_connection conn;
+ int res;
+
+ printf("testing RP-Reference wrap\n");
+
+ memset(&conn, 0, sizeof(conn));
+ conn.next_rp_ref = 255;
+
+ res = sms_next_rp_msg_ref(&conn);
+ printf("Allocated reference: %d\n", res);
+ OSMO_ASSERT(res == 255);
+
+ res = sms_next_rp_msg_ref(&conn);
+ printf("Allocated reference: %d\n", res);
+ OSMO_ASSERT(res == 0);
+
+ res = sms_next_rp_msg_ref(&conn);
+ printf("Allocated reference: %d\n", res);
+ OSMO_ASSERT(res == 1);
+}
+
int main(int argc, char **argv)
{
osmo_init_logging(&log_info);
@@ -460,6 +484,7 @@ int main(int argc, char **argv)
test_arfcn_filter();
test_print_encoding();
test_range_encoding();
+ test_gsm411_rp_ref_wrap();
printf("Done.\n");
return EXIT_SUCCESS;
diff --git a/openbsc/tests/gsm0408/gsm0408_test.ok b/openbsc/tests/gsm0408/gsm0408_test.ok
index 3d3c4e6a1..058563aab 100644
--- a/openbsc/tests/gsm0408/gsm0408_test.ok
+++ b/openbsc/tests/gsm0408/gsm0408_test.ok
@@ -58,4 +58,8 @@ Random range test: range 127, max num ARFCNs 29
Random range test: range 255, max num ARFCNs 22
Random range test: range 511, max num ARFCNs 18
Random range test: range 1023, max num ARFCNs 16
+testing RP-Reference wrap
+Allocated reference: 255
+Allocated reference: 0
+Allocated reference: 1
Done.