[sr-dev] git:master:9f3c45b8: ss7ops: Enable M2PA encapsulation in addition to M2UA

Holger Hans Peter Freyther holger at moiji-mobile.com
Fri Dec 23 09:48:52 CET 2016


Module: kamailio
Branch: master
Commit: 9f3c45b8967510e9c81aeb433c2ec14bcd58295c
URL: https://github.com/kamailio/kamailio/commit/9f3c45b8967510e9c81aeb433c2ec14bcd58295c

Author: Holger Hans Peter Freyther <holger at moiji-mobile.com>
Committer: Holger Hans Peter Freyther <holger at moiji-mobile.com>
Date: 2016-12-22T15:57:37+01:00

ss7ops: Enable M2PA encapsulation in addition to M2UA

Add support for M2PA encapsulation on top of M2UA. It will only
handle data messages as these can contain isup.

---

Modified: src/modules/ss7ops/ss7ops_mod.c

---

Diff:  https://github.com/kamailio/kamailio/commit/9f3c45b8967510e9c81aeb433c2ec14bcd58295c.diff
Patch: https://github.com/kamailio/kamailio/commit/9f3c45b8967510e9c81aeb433c2ec14bcd58295c.patch

---

diff --git a/src/modules/ss7ops/ss7ops_mod.c b/src/modules/ss7ops/ss7ops_mod.c
index cc9ddfb..ad2e448 100644
--- a/src/modules/ss7ops/ss7ops_mod.c
+++ b/src/modules/ss7ops/ss7ops_mod.c
@@ -29,12 +29,17 @@ MODULE_VERSION
 
 /* hep defines */
 #define HEP_M2UA		0x08
+#define HEP_M2PA		0x0d
 
 /* M2UA messages */
 #define M2UA_MSG	6
 #define M2UA_DATA	1
 #define M2UA_IE_DATA	0x0300
 
+/* M2PA messages */
+#define M2PA_CLASS	11
+#define M2PA_DATA	1
+
 /* MTPl3 */
 #define MTP_ISUP	0x05
 
@@ -188,6 +193,65 @@ static const uint8_t *extract_from_m2ua(const uint8_t *data, size_t *len)
 	return NULL;
 }
 
+static const uint8_t *extract_from_m2pa(const uint8_t *data, size_t *len)
+{
+	uint32_t data_len;
+
+	if (*len < 8) {
+		LM_ERR("M2PA hdr too short %zu\n", *len);
+		return NULL;
+	}
+
+	/* check the header */
+	if (data[0] != 0x01) {
+		LM_ERR("M2PA unknown version number %d\n", data[0]);
+		return NULL;
+	}
+	if (data[1] != 0x00) {
+		LM_ERR("M2PA unknown reserved fields %d\n", data[1]);
+		return NULL;
+	}
+	if (data[2] != M2PA_CLASS) {
+		LM_ERR("M2PA unhandled message class %d\n", data[2]);
+		return NULL;
+	}
+	if (data[3] != M2PA_DATA) {
+		LM_ERR("M2PA not data msg but %d\n", data[3]);
+		return NULL;
+	}
+
+	/* check the length */
+	memcpy(&data_len, &data[4], sizeof(data_len));
+	data_len = ntohl(data_len);
+	if (*len < data_len) {
+		LM_ERR("M2PA data can't fit %zu vs. %u\n", *len, data_len);
+		return NULL;
+	}
+
+	/* skip the header */
+	data += 8;
+	data_len -= 8;
+
+	/* BSN, FSN and then priority */
+	if (data_len < 8) {
+		LM_ERR("M2PA no space for BSN/FSN %u\n", data_len);
+		return NULL;
+	}
+	data += 8;
+	data_len -= 8;
+	if (data_len == 0)
+		return NULL;
+	else if (data_len < 1) {
+		LM_ERR("M2PA no space for prio %u\n", data_len);
+		return NULL;
+	}
+	data += 1;
+	data_len -= 1;
+
+	*len = data_len;
+	return data;
+}
+
 static const uint8_t *extract_from_mtp(const uint8_t *data, size_t *len,
 		int *opc, int *dpc, int *type)
 {
@@ -221,6 +285,9 @@ static const uint8_t *ss7_extract_payload(const uint8_t *data, size_t *len,
 		return extract_from_mtp(extract_from_m2ua(data, len), len, opc,
 				dpc, mtp_type);
 		break;
+	case HEP_M2PA:
+		return extract_from_mtp(extract_from_m2pa(data, len), len, opc,
+				dpc, mtp_type);
 	default:
 		LM_ERR("Unknown HEP type %d/0x%c\n", proto, proto);
 		return NULL;




More information about the sr-dev mailing list