aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/osmo-bts-sysmo/utils.c112
1 files changed, 63 insertions, 49 deletions
diff --git a/src/osmo-bts-sysmo/utils.c b/src/osmo-bts-sysmo/utils.c
index 01e6f973..f867a424 100644
--- a/src/osmo-bts-sysmo/utils.c
+++ b/src/osmo-bts-sysmo/utils.c
@@ -160,6 +160,53 @@ void prepend_oml_ipa_header(struct msgb *msg)
hh->len = htons(msg->len - sizeof(struct ipaccess_head));
}
+static int check_oml_fom(struct abis_om_hdr *omh, size_t len)
+{
+ if (omh->length != len) {
+ LOGP(DL1C, LOGL_ERROR, "Incorrect om length value %d %d\n",
+ omh->length, len);
+ return -1;
+ }
+
+ if (len < sizeof(struct abis_om_fom_hdr)) {
+ LOGP(DL1C, LOGL_ERROR, "Fom header insufficient space %d %d\n",
+ len, sizeof(struct abis_om_fom_hdr));
+ return -1;
+ }
+
+ return 0;
+}
+
+static int check_oml_manuf(struct abis_om_hdr *hdr, size_t msg_size)
+{
+ if (msg_size < 1) {
+ LOGP(DL1C, LOGL_ERROR, "No ManId Length Indicator %d\n",
+ msg_size);
+ return -1;
+ }
+
+ if (hdr->data[0] >= msg_size - 1) {
+ LOGP(DL1C, LOGL_ERROR,
+ "Insuficient message space for this ManId Lenght %d %d\n",
+ hdr->data[0], msg_size - 1);
+ return -1;
+ }
+
+ if (hdr->data[0] == sizeof(ipaccess_magic) &&
+ strncmp(ipaccess_magic, (const char *)hdr->data + 1,
+ sizeof(ipaccess_magic)) == 0) {
+ return OML_MSG_TYPE_IPA;
+ } else if (hdr->data[0] == sizeof(osmocom_magic) &&
+ strncmp(osmocom_magic, (const char *) hdr->data + 1,
+ sizeof(osmocom_magic)) == 0) {
+ return OML_MSG_TYPE_OSMO;
+ } else {
+ LOGP(DL1C, LOGL_ERROR,
+ "Manuf Label Unknown\n");
+ return -1;
+ }
+}
+
/**
* \brief Check that the data in \param msg is a proper OML message
*
@@ -182,14 +229,11 @@ void prepend_oml_ipa_header(struct msgb *msg)
int check_oml_msg(struct msgb *msg)
{
struct abis_om_hdr *omh;
- int abis_oml_hdr_len;
- char label_id[255];
+ int ret = OML_MSG_TYPE_ETSI;
- abis_oml_hdr_len = sizeof(struct abis_om_hdr);
-
- if (msg->len < abis_oml_hdr_len) {
+ if (msg->len < sizeof(*omh)) {
LOGP(DL1C, LOGL_ERROR, "Om header insufficient space %d %d\n",
- msg->len, abis_oml_hdr_len);
+ msg->len, sizeof(*omh));
return -1;
}
@@ -216,54 +260,24 @@ int check_oml_msg(struct msgb *msg)
return -1;
}
- if (omh->length != sizeof(struct abis_om_fom_hdr)) {
- LOGP(DL1C, LOGL_ERROR, "Incorrect om length value %d %d\n",
- omh->length, sizeof(struct abis_om_fom_hdr));
- return -1;
- }
-
- if (omh->mdisc == ABIS_OM_MDISC_MANUF) {
- abis_oml_hdr_len += sizeof(ipaccess_magic);
-
- if (msg->len < abis_oml_hdr_len) {
- LOGP(DL1C, LOGL_ERROR,
- "ID manuf label insufficient space %d %d\n",
- msg->len, abis_oml_hdr_len);
- return -1;
- }
- }
+ if (omh->mdisc == ABIS_OM_MDISC_MANUF)
+ ret = check_oml_manuf(omh, msgb_l2len(msg) - sizeof(*omh));
- abis_oml_hdr_len += sizeof(struct abis_om_fom_hdr);
+ if (ret == OML_MSG_TYPE_OSMO)
+ msg->l3h = omh->data + sizeof(osmocom_magic) + 1;
+ else if (ret == OML_MSG_TYPE_IPA)
+ msg->l3h = omh->data + sizeof(ipaccess_magic) + 1;
+ else if (ret == OML_MSG_TYPE_ETSI)
+ msg->l3h = omh->data;
+ else
+ msg->l3h = NULL;
- if (msg->len < abis_oml_hdr_len) {
- LOGP(DL1C, LOGL_ERROR, "Fom header insufficient space %d %d\n",
- msg->len, abis_oml_hdr_len);
+ if (ret < 0)
return -1;
- }
- msg->l3h = msg->data + sizeof(struct abis_om_hdr);
-
- if (omh->mdisc == ABIS_OM_MDISC_MANUF) {
- strncpy(label_id, (const char *) msg->l3h + 1,
- sizeof(ipaccess_magic));
-
- if (strncmp(ipaccess_magic, label_id,
- sizeof(ipaccess_magic)) == 0) {
- msg->l3h = msg->l3h + sizeof(ipaccess_magic) + 1;
- return OML_MSG_TYPE_IPA;
- } else if (strncmp(osmocom_magic, label_id,
- sizeof(osmocom_magic)) == 0) {
- msg->l3h = msg->l3h + sizeof(osmocom_magic) + 1;
- return OML_MSG_TYPE_OSMO;
- } else {
- msg->l3h = NULL;
- LOGP(DL1C, LOGL_ERROR,
- "Manuf Label Unknown %s\n", label_id);
- return -1;
- }
- }
+ check_oml_fom(omh, msgb_l3len(msg));
- return OML_MSG_TYPE_ETSI;
+ return ret;
}
int check_ipa_header(struct msgb *msg)