diff options
author | Harald Welte <laforge@gnumonks.org> | 2017-04-03 19:24:06 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2017-04-03 22:11:41 +0200 |
commit | 178abb9e364d01df222d0b017ef873d9b1ace847 (patch) | |
tree | 4a4d28ba0b2f724501dac9c3e290dea5ed64d430 | |
parent | cafb7d417cb60e7f9ee5f712417e63eae4639c76 (diff) |
sua: Make use of xua_msg_dialect
We fill in the data structures of a xua_msg_dialect and make use of it
for generic mandatory IE checking and messageheader printing.
Change-Id: I966103f30b9be247ba6905ba8e06b87654d9981a
-rw-r--r-- | src/sua.c | 170 |
1 files changed, 162 insertions, 8 deletions
@@ -37,6 +37,8 @@ #include <osmocom/sigtran/protocol/sua.h> #include <osmocom/sigtran/sua.h> +#include "xua_internal.h" + #define SUA_MSGB_SIZE 1500 /* Appendix C.4 of Q.714 (all in milliseconds) */ @@ -49,6 +51,161 @@ #define GUARD_TIMER (23 * 60 * 100) #define RESET_TIMER ( 10 * 100) +/*********************************************************************** + * Protocol Definition (string tables, mandatory IE checking) + ***********************************************************************/ + +static const struct value_string sua_iei_names[] = { + { SUA_IEI_ROUTE_CTX, "Routing Context" }, + { SUA_IEI_CORR_ID, "Correlation Id" }, + { SUA_IEI_REG_RESULT, "Registration Result" }, + { SUA_IEI_DEREG_RESULT, "De-Registration Result" }, + + { SUA_IEI_S7_HOP_CTR, "SS7 Hop Counter" }, + { SUA_IEI_SRC_ADDR, "Source Address" }, + { SUA_IEI_DEST_ADDR, "Destination Address" }, + { SUA_IEI_SRC_REF, "Source Reference" }, + { SUA_IEI_DEST_REF, "Destination Reference" }, + { SUA_IEI_CAUSE, "Cause" }, + { SUA_IEI_SEQ_NR, "Sequence Number" }, + { SUA_IEI_RX_SEQ_NR, "Receive Sequence Number" }, + { SUA_IEI_ASP_CAPA, "ASP Capability" }, + { SUA_IEI_CREDIT, "Credit" }, + { SUA_IEI_DATA, "Data" }, + { SUA_IEI_USER_CAUSE, "User/Cause" }, + { SUA_IEI_NET_APPEARANCE, "Network Appearance" }, + { SUA_IEI_ROUTING_KEY, "Routing Key" }, + { SUA_IEI_DRN, "DRN Label" }, + { SUA_IEI_TID, "TID Label" }, + { SUA_IEI_SMI, "SMI" }, + { SUA_IEI_IMPORTANCE, "Importance" }, + { SUA_IEI_MSG_PRIO, "Message Priority" }, + { SUA_IEI_PROTO_CLASS, "Protocol Class" }, + { SUA_IEI_SEQ_CTRL, "Sequence Control" }, + { SUA_IEI_SEGMENTATION, "Segmentation" }, + { SUA_IEI_CONG_LEVEL, "Congestion Level" }, + + { SUA_IEI_GT, "Global Title" }, + { SUA_IEI_PC, "Point Code" }, + { SUA_IEI_SSN, "Sub-System Number" }, + { SUA_IEI_IPv4, "IPv4 Address" }, + { SUA_IEI_HOST, "Host Name" }, + { SUA_IEI_IPv6, "IPv6 Address" }, + { 0, NULL } +}; + +#define MAND_IES(msgt, ies) [msgt] = (ies) + +static const uint16_t cldt_mand_ies[] = { + SUA_IEI_ROUTE_CTX, SUA_IEI_PROTO_CLASS, SUA_IEI_SRC_ADDR, + SUA_IEI_DEST_ADDR, SUA_IEI_SEQ_CTRL, SUA_IEI_DATA, 0 +}; +static const uint16_t cldr_mand_ies[] = { + SUA_IEI_ROUTE_CTX, SUA_IEI_CAUSE, SUA_IEI_SRC_ADDR, + SUA_IEI_DEST_ADDR, 0 +}; +static const struct value_string sua_cl_msgt_names[] = { + { SUA_CL_CLDT, "CLDT" }, + { SUA_CL_CLDR, "CLDR" }, + { 0, NULL } +}; +static const struct xua_msg_class msg_class_cl = { + .name = "CL", + .msgt_names = sua_cl_msgt_names, + .iei_names = sua_iei_names, + .mand_ies = { + MAND_IES(SUA_CL_CLDT, cldt_mand_ies), + MAND_IES(SUA_CL_CLDR, cldr_mand_ies), + }, +}; + +static const uint16_t codt_mand_ies[] = { + SUA_IEI_ROUTE_CTX, SUA_IEI_DEST_REF, SUA_IEI_DATA, 0 +}; +static const uint16_t coda_mand_ies[] = { + SUA_IEI_ROUTE_CTX, SUA_IEI_DEST_REF, 0 +}; +static const uint16_t core_mand_ies[] = { + SUA_IEI_ROUTE_CTX, SUA_IEI_PROTO_CLASS, SUA_IEI_SRC_REF, + SUA_IEI_DEST_ADDR, SUA_IEI_SEQ_CTRL, 0 +}; +static const uint16_t coak_mand_ies[] = { + SUA_IEI_ROUTE_CTX, SUA_IEI_PROTO_CLASS, SUA_IEI_DEST_REF, + SUA_IEI_SRC_REF, SUA_IEI_SEQ_CTRL, 0 +}; +static const uint16_t coref_mand_ies[] = { + SUA_IEI_ROUTE_CTX, SUA_IEI_DEST_REF, SUA_IEI_CAUSE, 0 +}; +static const uint16_t relre_mand_ies[] = { + SUA_IEI_ROUTE_CTX, SUA_IEI_DEST_REF, SUA_IEI_SRC_REF, + SUA_IEI_CAUSE, 0 +}; +static const uint16_t relco_mand_ies[] = { + SUA_IEI_ROUTE_CTX, SUA_IEI_DEST_REF, SUA_IEI_SRC_REF, 0 +}; +static const uint16_t resre_mand_ies[] = { + SUA_IEI_ROUTE_CTX, SUA_IEI_DEST_REF, SUA_IEI_SRC_REF, + SUA_IEI_CAUSE, 0 +}; +static const uint16_t resco_mand_ies[] = { + SUA_IEI_ROUTE_CTX, SUA_IEI_DEST_REF, SUA_IEI_SRC_REF, 0 +}; +static const uint16_t coerr_mand_ies[] = { + SUA_IEI_ROUTE_CTX, SUA_IEI_DEST_REF, SUA_IEI_CAUSE, 0 +}; +static const uint16_t coit_mand_ies[] = { + SUA_IEI_ROUTE_CTX, SUA_IEI_PROTO_CLASS, SUA_IEI_SRC_REF, + SUA_IEI_DEST_REF, 0 +}; +static const struct value_string sua_co_msgt_names[] = { + { SUA_CO_CODT, "CODT" }, + { SUA_CO_CODA, "CODA" }, + { SUA_CO_CORE, "CORE" }, + { SUA_CO_COAK, "COAK" }, + { SUA_CO_COREF, "COREF" }, + { SUA_CO_RELRE, "RELRE" }, + { SUA_CO_RELCO, "RELCO" }, + { SUA_CO_RESRE, "RESRE" }, + { SUA_CO_RESCO, "RESCO" }, + { SUA_CO_COERR, "COERR" }, + { SUA_CO_COIT, "COIT" }, + { 0, NULL } +}; +static const struct xua_msg_class msg_class_co = { + .name = "CO", + .msgt_names = sua_co_msgt_names, + .iei_names = sua_iei_names, + .mand_ies = { + MAND_IES(SUA_CO_CODT, codt_mand_ies), + MAND_IES(SUA_CO_CODA, coda_mand_ies), + MAND_IES(SUA_CO_CORE, core_mand_ies), + MAND_IES(SUA_CO_COAK, coak_mand_ies), + MAND_IES(SUA_CO_COREF, coref_mand_ies), + MAND_IES(SUA_CO_RELRE, relre_mand_ies), + MAND_IES(SUA_CO_RELCO, relco_mand_ies), + MAND_IES(SUA_CO_RESRE, resre_mand_ies), + MAND_IES(SUA_CO_RESCO, resco_mand_ies), + MAND_IES(SUA_CO_COERR, coerr_mand_ies), + MAND_IES(SUA_CO_COIT, coit_mand_ies), + }, +}; + +const struct xua_dialect xua_dialect_sua = { + .name = "SUA", + .ppid = SUA_PPID, + .port = SUA_PORT, + .class = { + [SUA_MSGC_MGMT] = &m3ua_msg_class_mgmt, + [SUA_MSGC_SNM] = &m3ua_msg_class_snm, + [SUA_MSGC_ASPSM] = &m3ua_msg_class_aspsm, + [SUA_MSGC_ASPTM] = &m3ua_msg_class_asptm, + [SUA_MSGC_CL] = &msg_class_cl, + [SUA_MSGC_CO] = &msg_class_co, + [SUA_MSGC_RKM] = &m3ua_msg_class_rkm, + }, +}; + + static int DSUA = -1; struct osmo_sccp_user { @@ -773,9 +930,6 @@ static int sua_rx_cl(struct osmo_sccp_link *link, { int rc = -1; - if (!check_all_mand_ies(mand_ies_cl, xua)) - return -1; - switch (xua->hdr.msg_type) { case SUA_CL_CLDT: rc = sua_rx_cldt(link, xua); @@ -1094,9 +1248,6 @@ static int sua_rx_co(struct osmo_sccp_link *link, { int rc = -1; - if (!check_all_mand_ies(mand_ies_co, xua)) - return -1; - switch (xua->hdr.msg_type) { case SUA_CO_CORE: rc = sua_rx_core(link, xua); @@ -1142,8 +1293,11 @@ static int sua_rx_msg(struct osmo_sccp_link *link, struct msgb *msg) return -EIO; } - LOGP(DSUA, LOGL_DEBUG, "Received SUA Message (%u:%u)\n", - xua->hdr.msg_class, xua->hdr.msg_type); + LOGP(DSUA, LOGL_DEBUG, "Received SUA Message (%s)\n", + xua_hdr_dump(xua, &xua_dialect_sua)); + + if (!xua_dialect_check_all_mand_ies(&xua_dialect_sua, xua)) + return -1; switch (xua->hdr.msg_class) { case SUA_MSGC_CL: |