diff options
author | Harald Welte <laforge@gnumonks.org> | 2018-03-17 21:40:32 +0100 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2018-03-17 21:46:56 +0100 |
commit | f94cbf607b471a516b6a25c408309bb3cd99bff5 (patch) | |
tree | bb7964009f2d9f13f29667b92f42d296a94e8400 | |
parent | 4a1580b7ff6589c5dc67774a93a468f0d922f33b (diff) |
RR: Send RR STATUS in case of unsupported/unknown message
This fixes BSC_Tests.TC_err_84_unknown_msg
Related: OS#2903
Change-Id: I7ecb48971c6a162c7f4c749d128c31d0dbc4916f
-rw-r--r-- | include/osmocom/bsc/gsm_04_08_utils.h | 3 | ||||
-rw-r--r-- | src/libbsc/bsc_api.c | 3 | ||||
-rw-r--r-- | src/libbsc/gsm_04_08_utils.c | 27 |
3 files changed, 33 insertions, 0 deletions
diff --git a/include/osmocom/bsc/gsm_04_08_utils.h b/include/osmocom/bsc/gsm_04_08_utils.h index 34979abfc..bdfca71a2 100644 --- a/include/osmocom/bsc/gsm_04_08_utils.h +++ b/include/osmocom/bsc/gsm_04_08_utils.h @@ -28,6 +28,9 @@ int gsm48_paging_extract_mi(struct gsm48_pag_resp *resp, int length, char *mi_string, uint8_t *mi_type); struct msgb *gsm48_create_loc_upd_rej(uint8_t cause); +struct msgb *gsm48_create_rr_status(uint8_t cause); +int gsm48_tx_rr_status(struct gsm_subscriber_connection *conn, uint8_t cause); + #define GSM48_ALLOC_SIZE 2048 #define GSM48_ALLOC_HEADROOM 256 diff --git a/src/libbsc/bsc_api.c b/src/libbsc/bsc_api.c index 156ea1a29..748245342 100644 --- a/src/libbsc/bsc_api.c +++ b/src/libbsc/bsc_api.c @@ -646,6 +646,7 @@ static void dispatch_dtap(struct gsm_subscriber_connection *conn, * L3 Info of 08.58 MEASUREMENT REPORT different by calling * directly into gsm48_parse_meas_rep */ LOGP(DMEAS, LOGL_ERROR, "DIRECT GSM48 MEASUREMENT REPORT ?!? "); + gsm48_tx_rr_status(conn, GSM48_RR_CAUSE_MSG_TYPE_N_COMPAT); break; case GSM48_MT_RR_HANDO_COMPL: handle_rr_ho_compl(msg); @@ -692,6 +693,8 @@ static void dispatch_dtap(struct gsm_subscriber_connection *conn, LOGP(DRR, LOGL_NOTICE, "%s Dropping %s 04.08 RR message\n", gsm_lchan_name(conn->lchan), gsm48_rr_msg_name(msg_type)); + gsm48_tx_rr_status(conn, GSM48_RR_CAUSE_MSG_TYPE_N); + break; } break; default: diff --git a/src/libbsc/gsm_04_08_utils.c b/src/libbsc/gsm_04_08_utils.c index b75b42f9f..f30640fb1 100644 --- a/src/libbsc/gsm_04_08_utils.c +++ b/src/libbsc/gsm_04_08_utils.c @@ -640,6 +640,33 @@ int gsm48_tx_mm_serv_rej(struct gsm_subscriber_connection *conn, return gsm0808_submit_dtap(conn, msg, 0, 0); } +/* 9.1.29 RR Status */ +struct msgb *gsm48_create_rr_status(uint8_t cause) +{ + struct msgb *msg; + struct gsm48_hdr *gh; + + msg = gsm48_msgb_alloc_name("GSM 04.08 RR STATUS"); + if (!msg) + return NULL; + + gh = (struct gsm48_hdr *) msgb_put(msg, sizeof(*gh) + 1); + gh->proto_discr = GSM48_PDISC_RR; + gh->msg_type = GSM48_MT_RR_STATUS; + gh->data[0] = cause; + + return msg; +} + +/* 9.1.29 RR Status */ +int gsm48_tx_rr_status(struct gsm_subscriber_connection *conn, uint8_t cause) +{ + struct msgb *msg = gsm48_create_rr_status(cause); + if (!msg) + return -1; + return gsm0808_submit_dtap(conn, msg, 0, 0); +} + struct msgb *gsm48_create_mm_serv_rej(enum gsm48_reject_value value) { struct msgb *msg; |