diff options
author | Harald Welte <laforge@gnumonks.org> | 2017-04-09 18:10:19 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2017-04-10 11:48:35 +0200 |
commit | 6f8c84b27ecd83a87ff160b370aeab5c553527fb (patch) | |
tree | f3bd728b7417f6909a0d1d2b9a249c9c11e42b73 /src/xua_asp_fsm.c | |
parent | f21eaabe24bf77d4e38a0597ad7640dc763d06f6 (diff) |
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
Diffstat (limited to 'src/xua_asp_fsm.c')
-rw-r--r-- | src/xua_asp_fsm.c | 32 |
1 files changed, 32 insertions, 0 deletions
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 @@ static int peer_send(struct osmo_fsm_inst *fi, int out_event, struct xua_msg *in 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_down_onenter(struct osmo_fsm_inst *fi, uint32_t prev_sta 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 @@ static void xua_asp_fsm_inactive(struct osmo_fsm_inst *fi, uint32_t event, void 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 */ |