Implement sending SMS and send one on network registration
diff --git a/include/openbsc/gsm_04_11.h b/include/openbsc/gsm_04_11.h
index 1c04467..7167a55 100644
--- a/include/openbsc/gsm_04_11.h
+++ b/include/openbsc/gsm_04_11.h
@@ -46,8 +46,28 @@
 	u_int8_t *user_data;
 };
 
+/* SMS deliver PDU */
+struct sms_deliver {
+	u_int8_t *smsc;
+	u_int8_t mti:2;
+	u_int8_t rd:1;
+	u_int8_t vpf:2;
+	u_int8_t srr:1;
+	u_int8_t udhi:1;
+	u_int8_t rp:1;
+	u_int8_t msg_ref;
+	u_int8_t *orig_addr;
+	u_int8_t pid;
+	u_int8_t dcs;
+	u_int8_t vp;
+	u_int8_t ud_len;
+	u_int8_t *user_data;
+};
+
 struct msgb;
 
 int gsm0411_rcv_sms(struct msgb *msg);
 
+int gsm0411_send_sms(struct gsm_lchan *lchan, struct sms_deliver *sms);
+
 #endif
diff --git a/src/gsm_04_08.c b/src/gsm_04_08.c
index a1a8f37..c367102 100644
--- a/src/gsm_04_08.c
+++ b/src/gsm_04_08.c
@@ -193,6 +193,8 @@
 
 	gsm48_sendmsg(msg);
 
+	gsm0411_send_sms(lchan, 0);
+
 	return gsm48_cc_tx_setup(lchan);
 }
 
diff --git a/src/gsm_04_11.c b/src/gsm_04_11.c
index fb86929..76a5cdd 100644
--- a/src/gsm_04_11.c
+++ b/src/gsm_04_11.c
@@ -73,6 +73,12 @@
 	return text;
 }
 
+static u_int8_t gsm0411_tpdu_from_sms(u_int8_t *tpdu, struct sms_deliver *sms)
+{
+	u_int8_t len = 0;
+
+}
+
 static int gsm411_sms_submit_from_msgb(struct msgb *msg)
 {
 	u_int8_t *smsp = msgb_sms(msg);
@@ -216,3 +222,45 @@
 	return rc;
 }
 
+/* Test TPDU */
+static u_int8_t tpdu_test[] = {
+	0x00, 0x01, 0x00, 0x04, 0x81, 0x32, 0x24, 0x00, 0x00, 0x24, 0xD7, 0x32, 0x7B, 0xFC, 0x6E, 0x97, 0x41, 0xF4, 0x37, 0x88, 0x8E, 0x2E, 0x83, 0x64, 0xB5, 0xE1, 0x0C, 0x74, 0x9C, 0x36, 0x41, 0xF4, 0xF2, 0x9C, 0x0E, 0x72, 0x97, 0xE9, 0xF7, 0xB7, 0x7C, 0x0D
+};
+
+int gsm0411_send_sms(struct gsm_lchan *lchan, struct sms_deliver *sms)
+{
+	struct msgb *msg = gsm411_msgb_alloc();
+	struct gsm48_hdr *gh;
+	struct gsm411_rp_hdr *rp;
+	u_int8_t *data, *tpdu, smslen;
+
+	msg->lchan = lchan;
+
+	gh = (struct gsm48_hdr *) msgb_put(msg, sizeof(*gh));
+	gh->proto_discr = GSM48_PDISC_SMS;
+	gh->msg_type = GSM411_MT_CP_DATA;
+
+	rp = (struct gsm411_rp_hdr *)msgb_put(msg, sizeof(*rp));
+	rp->msg_type = GSM411_MT_RP_DATA_MT;
+	rp->msg_ref = 42; /* FIXME: Choose randomly */
+	/* No OA or DA for now */
+	data = (u_int8_t *)msgb_put(msg, 1);
+	data[0] = 0;
+	data = (u_int8_t *)msgb_put(msg, 1);
+	data[0] = 0;
+
+	/* FIXME: Hardcoded for now */
+	smslen = gsm0411_tpdu_from_sms(tpdu, sms);
+
+	data = (u_int8_t *)msgb_put(msg, sizeof(tpdu_test));
+
+	//memcpy(data, tpdu, smslen);
+	memcpy(data, tpdu_test, sizeof(tpdu_test));
+
+	free(tpdu);
+
+	DEBUGP(DSMS, "TX: SMS SUBMIT\n");
+
+	return gsm0411_sendmsg(msg);
+}
+
diff --git a/tests/gsm0408/gsm0408_test.c b/tests/gsm0408/gsm0408_test.c
index 8705741..659a03b 100644
--- a/tests/gsm0408/gsm0408_test.c
+++ b/tests/gsm0408/gsm0408_test.c
@@ -78,3 +78,4 @@
 void db_create_subscriber(void) {}
 void rsl_chan_release(void) {}
 void msgb_alloc(void) {}
+void gsm0411_send_sms(void) {}
diff --git a/tests/sms/sms_test.c b/tests/sms/sms_test.c
index ebecb56..be166e4 100644
--- a/tests/sms/sms_test.c
+++ b/tests/sms/sms_test.c
@@ -85,4 +85,6 @@
 		gsm0411_rcv_sms(msg);
 		msgb_free(msg);
 	}
+
+	gsm0411_send_sms(0, 0);
 }