Parse sms-submit messages
diff --git a/include/openbsc/gsm_04_11.h b/include/openbsc/gsm_04_11.h
index 3f4b0a3..84751a3 100644
--- a/include/openbsc/gsm_04_11.h
+++ b/include/openbsc/gsm_04_11.h
@@ -22,12 +22,30 @@
 
 /* Chapter 8.1.1 */
 struct gsm411_rp_data_hdr {
-  u_int8_t len;
-  u_int8_t msg_type;
+	u_int8_t len;
+	u_int8_t msg_type;
 	u_int8_t msg_ref;
 	u_int8_t data[0];
 } __attribute__ ((packed));
 
+/* SMS submit PDU */
+struct sms_submit {
+	u_int8_t *smsc;
+	u_int8_t mti:2;
+	u_int8_t mms:1;
+	u_int8_t vpf:2;
+	u_int8_t sri:1;
+	u_int8_t udhi:1;
+	u_int8_t rp:1;
+	u_int8_t msg_ref;
+	u_int8_t *dest_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);
diff --git a/include/openbsc/msgb.h b/include/openbsc/msgb.h
index cfb9121..db1f8ae 100644
--- a/include/openbsc/msgb.h
+++ b/include/openbsc/msgb.h
@@ -36,6 +36,7 @@
 
 	unsigned char *l2h;
 	unsigned char *l3h;
+	unsigned char *smsh;
 
 	u_int16_t data_len;
 	u_int16_t len;
@@ -53,6 +54,7 @@
 
 #define msgb_l2(m)	((void *)(m->l2h))
 #define msgb_l3(m)	((void *)(m->l3h))
+#define msgb_sms(m)	((void *)(m->smsh))
 
 static inline unsigned int msgb_headlen(const struct msgb *msgb)
 {