From 2c0f16699e80ab492e3b7f8ad3de181ca90e5ef1 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Tue, 15 Jun 2010 19:39:27 +0800 Subject: [PATCH] gsm48: Separate CM Service Reject sending and creation. Split out the msg generation from the sending, this will be used by the nat to send a refusal message. --- openbsc/include/openbsc/gsm_04_08.h | 1 + openbsc/src/gsm_04_08.c | 16 +++++++--------- openbsc/src/gsm_04_08_utils.c | 17 +++++++++++++++++ 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/openbsc/include/openbsc/gsm_04_08.h b/openbsc/include/openbsc/gsm_04_08.h index 1e5ffced6..55f877622 100644 --- a/openbsc/include/openbsc/gsm_04_08.h +++ b/openbsc/include/openbsc/gsm_04_08.h @@ -60,5 +60,6 @@ int gsm48_lchan_modify(struct gsm_lchan *lchan, u_int8_t lchan_mode); int gsm48_rx_rr_modif_ack(struct msgb *msg); int gsm48_parse_meas_rep(struct gsm_meas_rep *rep, struct msgb *msg); +struct msgb *gsm48_create_mm_serv_rej(enum gsm48_reject_value value); #endif diff --git a/openbsc/src/gsm_04_08.c b/openbsc/src/gsm_04_08.c index e3eafe6a5..21bdfc51a 100644 --- a/openbsc/src/gsm_04_08.c +++ b/openbsc/src/gsm_04_08.c @@ -709,19 +709,17 @@ static int gsm48_tx_mm_serv_ack(struct gsm_lchan *lchan) static int gsm48_tx_mm_serv_rej(struct gsm_subscriber_connection *conn, enum gsm48_reject_value value) { - struct msgb *msg = gsm48_msgb_alloc(); - struct gsm48_hdr *gh; + struct msgb *msg; - gh = (struct gsm48_hdr *) msgb_put(msg, sizeof(*gh) + 1); + msg = gsm48_create_mm_serv_rej(value); + if (!msg) { + LOGP(DMM, LOGL_ERROR, "Failed to allocate CM Service Reject.\n"); + return -1; + } + DEBUGP(DMM, "-> CM SERVICE Reject cause: %d\n", value); msg->lchan = conn->lchan; use_subscr_con(conn); - - gh->proto_discr = GSM48_PDISC_MM; - gh->msg_type = GSM48_MT_MM_CM_SERV_REJ; - gh->data[0] = value; - DEBUGP(DMM, "-> CM SERVICE Reject cause: %d\n", value); - return gsm48_conn_sendmsg(msg, conn, NULL); } diff --git a/openbsc/src/gsm_04_08_utils.c b/openbsc/src/gsm_04_08_utils.c index 5a8ded784..eb8c03413 100644 --- a/openbsc/src/gsm_04_08_utils.c +++ b/openbsc/src/gsm_04_08_utils.c @@ -564,3 +564,20 @@ int gsm48_parse_meas_rep(struct gsm_meas_rep *rep, struct msgb *msg) return 0; } + +struct msgb *gsm48_create_mm_serv_rej(enum gsm48_reject_value value) +{ + struct msgb *msg; + struct gsm48_hdr *gh; + + msg = gsm48_msgb_alloc(); + if (!msg) + return NULL; + + gh = (struct gsm48_hdr *) msgb_put(msg, sizeof(*gh) + 1); + gh->proto_discr = GSM48_PDISC_MM; + gh->msg_type = GSM48_MT_MM_CM_SERV_REJ; + gh->data[0] = value; + + return msg; +}