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.
diff --git a/openbsc/src/libmsc/Makefile.am b/openbsc/src/libmsc/Makefile.am
index 2b50599..1e58cd1 100644
--- a/openbsc/src/libmsc/Makefile.am
+++ b/openbsc/src/libmsc/Makefile.am
@@ -6,7 +6,8 @@
 
 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 97a67ee..45e5dc5 100644
--- a/openbsc/src/libmsc/gsm_04_11.c
+++ b/openbsc/src/libmsc/gsm_04_11.c
@@ -450,7 +450,7 @@
 	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 @@
 	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 0000000..f48c6de
--- /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;
+}
+