aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2017-04-03 18:24:23 +0200
committerHarald Welte <laforge@gnumonks.org>2017-04-03 18:26:01 +0200
commite7c50f78e74bfec4b6a120e75a32ea4ba48fc969 (patch)
tree74e31518019f309b574abda0318b8abad47cea07
parentbc8e66f73d68d507537955b5da04033678fa51aa (diff)
xua_msg: Add support for msg_event_maps
msg_event_maps facilitate the mapping from a xUA message (class + type) to an integer event. This is useful when passing xUA messages to a osmo_fsm. Change-Id: Iee1c7fc2bf64219ebb71a0dbe6fd210749332413
-rw-r--r--include/osmocom/sigtran/xua_msg.h9
-rw-r--r--src/xua_msg.c21
2 files changed, 30 insertions, 0 deletions
diff --git a/include/osmocom/sigtran/xua_msg.h b/include/osmocom/sigtran/xua_msg.h
index 60dd693..320da6a 100644
--- a/include/osmocom/sigtran/xua_msg.h
+++ b/include/osmocom/sigtran/xua_msg.h
@@ -60,6 +60,12 @@ struct xua_dialect {
const struct xua_msg_class *class[256];
};
+struct xua_msg_event_map {
+ uint8_t msg_class;
+ uint8_t msg_type;
+ int event;
+};
+
extern const struct xua_dialect xua_dialect_sua;
extern const struct xua_dialect xua_dialect_m3ua;
@@ -94,3 +100,6 @@ char *xua_hdr_dump(struct xua_msg *xua, const struct xua_dialect *dialect);
char *xua_msg_dump(struct xua_msg *xua, const struct xua_dialect *dialect);
int xua_dialect_check_all_mand_ies(const struct xua_dialect *dialect, struct xua_msg *xua);
+int xua_msg_event_map(const struct xua_msg *xua,
+ const struct xua_msg_event_map *maps,
+ unsigned int num_maps);
diff --git a/src/xua_msg.c b/src/xua_msg.c
index e094cb6..27279ce 100644
--- a/src/xua_msg.c
+++ b/src/xua_msg.c
@@ -361,6 +361,27 @@ int xua_msg_add_sccp_addr(struct xua_msg *xua, uint16_t iei, const struct osmo_s
return rc;
}
+/*! \brief Map from a xua_msg (class+type) to an event
+ * \param[in] xua xUA message which is to be mapped
+ * \param[in] maps Table containing msg type+class -> event maps
+ * \[aram[in] num_maps number of entries in \ref maps
+ * \returns event >= 0; negative on error (no map found) */
+int xua_msg_event_map(const struct xua_msg *xua,
+ const struct xua_msg_event_map *maps,
+ unsigned int num_maps)
+{
+ int i;
+
+ for (i= 0; i < num_maps; i++) {
+ const struct xua_msg_event_map *map = &maps[i];
+ if (xua->hdr.msg_class == map->msg_class &&
+ xua->hdr.msg_type == map->msg_type) {
+ return map->event;
+ }
+ }
+ return -1;
+}
+
const char *xua_class_msg_name(const struct xua_msg_class *xmc, uint16_t msg_type)
{
static char class_buf[64];