Review at  https://gerrit.osmocom.org/2270

M3UA: Make sure to reject unsupported traffic mode types

This was discovered (and fix validated) using m3ua-sgp-asptm-i-004 of
Michael Tuexen's m3ua-testtool.

Change-Id: I76c01189b75ff3084cd4d3944314ec9b9f811dbf
---
M src/xua_asp_fsm.c
1 file changed, 32 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/libosmo-sccp refs/changes/70/2270/1

diff --git a/src/xua_asp_fsm.c b/src/xua_asp_fsm.c
index 1570bc9..87f8927 100644
--- a/src/xua_asp_fsm.c
+++ b/src/xua_asp_fsm.c
@@ -210,6 +210,25 @@
        return osmo_ss7_asp_send(asp, msg);
 }
 
+static int peer_send_error(struct osmo_fsm_inst *fi, uint32_t err_code)
+{
+       struct xua_asp_fsm_priv *xafp = fi->priv;
+       struct osmo_ss7_asp *asp = xafp->asp;
+       struct xua_msg *xua = xua_msg_alloc();
+       struct msgb *msg;
+
+       xua->hdr = XUA_HDR(SUA_MSGC_MGMT, SUA_MGMT_ERR);
+       xua->hdr.version = SUA_VERSION;
+       xua_msg_add_u32(xua, SUA_IEI_ERR_CODE, err_code);
+
+       msg = xua_to_msg(SUA_VERSION, xua);
+       xua_msg_free(xua);
+       if (!msg)
+               return -1;
+
+       return osmo_ss7_asp_send(asp, msg);
+}
+
 static void xua_t_ack_cb(void *data)
 {
        struct osmo_fsm_inst *fi = data;
@@ -373,6 +392,9 @@
 
 static void xua_asp_fsm_inactive(struct osmo_fsm_inst *fi, uint32_t event, 
void *data)
 {
+       struct xua_msg *xua_in;
+       uint32_t traf_mode;
+
        check_stop_t_ack(fi, event);
        switch (event) {
        case XUA_ASP_E_M_ASP_ACTIVE_REQ:
@@ -400,8 +422,18 @@
                                     PRIM_OP_CONFIRM);
                break;
        case XUA_ASP_E_ASPTM_ASPAC:
+               xua_in = data;
                /* only in role SG */
                ENSURE_SG_OR_IPSP(fi, event);
+               if (xua_msg_find_tag(xua_in, M3UA_IEI_TRAF_MODE_TYP)) {
+                       traf_mode = xua_msg_get_u32(xua_in, 
M3UA_IEI_TRAF_MODE_TYP);
+                       if (traf_mode != M3UA_TMOD_OVERRIDE &&
+                           traf_mode != M3UA_TMOD_LOADSHARE &&
+                           traf_mode != M3UA_TMOD_BCAST) {
+                               peer_send_error(fi, 
M3UA_ERR_UNSUPP_TRAF_MOD_TYP);
+                               break;
+                       }
+               }
                /* send ACK */
                peer_send(fi, XUA_ASP_E_ASPTM_ASPAC_ACK, NULL);
                /* transition state and inform layer manager */

-- 
To view, visit https://gerrit.osmocom.org/2270
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I76c01189b75ff3084cd4d3944314ec9b9f811dbf
Gerrit-PatchSet: 1
Gerrit-Project: libosmo-sccp
Gerrit-Branch: master
Gerrit-Owner: Harald Welte <[email protected]>

Reply via email to