aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2017-04-09 18:10:19 +0200
committerHarald Welte <laforge@gnumonks.org>2017-04-09 21:30:53 +0200
commitfe9c7db5246e345105eb89a4e5369b3e12cc0bc1 (patch)
tree624f50f0a27824700034a9a271f399e33b2d3839
parent4caa45221c9beae7b2d1a13b380e3b2227b9d81a (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
-rw-r--r--src/xua_asp_fsm.c32
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 */