[PATCH 3/3] [mobile] introduce and use gsm48_mmevevent_input()

Harald Welte laforge at gnumonks.org
Sun Jan 30 19:58:47 UTC 2011


... instead of using sequences of gsm48_mmevent_msgb_alloc() followed by
gsm48_mmevent_msg()
---
 .../layer23/include/osmocom/bb/mobile/gsm48_mm.h   |    4 +-
 src/host/layer23/src/mobile/app_mobile.c           |    5 +--
 src/host/layer23/src/mobile/gsm322.c               |   41 +++-----------------
 src/host/layer23/src/mobile/gsm48_mm.c             |   41 ++++++++++++--------
 src/host/layer23/src/mobile/gsm48_rr.c             |    6 +--
 src/host/layer23/src/mobile/subscriber.c           |   31 +++------------
 6 files changed, 41 insertions(+), 87 deletions(-)

diff --git a/src/host/layer23/include/osmocom/bb/mobile/gsm48_mm.h b/src/host/layer23/include/osmocom/bb/mobile/gsm48_mm.h
index 447dc95..c141d5c 100644
--- a/src/host/layer23/include/osmocom/bb/mobile/gsm48_mm.h
+++ b/src/host/layer23/include/osmocom/bb/mobile/gsm48_mm.h
@@ -210,8 +210,8 @@ struct gsm48_mm_conn {
 int gsm48_mm_init(struct osmocom_ms *ms);
 int gsm48_mm_exit(struct osmocom_ms *ms);
 struct msgb *gsm48_mmr_msgb_alloc(int msg_type);
-struct msgb *gsm48_mmevent_msgb_alloc(int msg_type);
-int gsm48_mmevent_msg(struct osmocom_ms *ms, struct msgb *msg);
+int gsm48_mmevent_input(struct osmocom_ms *ms, int msg_type,
+			const uint8_t *data, unsigned int len);
 int gsm48_mmr_downmsg(struct osmocom_ms *ms, struct msgb *msg);
 int gsm48_rr_dequeue(struct osmocom_ms *ms);
 int gsm48_mmxx_dequeue(struct osmocom_ms *ms);
diff --git a/src/host/layer23/src/mobile/app_mobile.c b/src/host/layer23/src/mobile/app_mobile.c
index b3c3284..4e6a803 100644
--- a/src/host/layer23/src/mobile/app_mobile.c
+++ b/src/host/layer23/src/mobile/app_mobile.c
@@ -124,10 +124,7 @@ int mobile_exit(struct osmocom_ms *ms, int force)
 		struct msgb *nmsg;
 
 		ms->shutdown = 1; /* going down */
-		nmsg = gsm48_mmevent_msgb_alloc(GSM48_MM_EVENT_IMSI_DETACH);
-		if (!nmsg)
-			return -ENOMEM;
-		gsm48_mmevent_msg(mm->ms, nmsg);
+		gsm48_mmevent_input(ms, GSM48_MM_EVENT_IMSI_DETACH, NULL, 0);
 
 		return -EBUSY;
 	}
diff --git a/src/host/layer23/src/mobile/gsm322.c b/src/host/layer23/src/mobile/gsm322.c
index 3243afc..60b24cb 100644
--- a/src/host/layer23/src/mobile/gsm322.c
+++ b/src/host/layer23/src/mobile/gsm322.c
@@ -1174,17 +1174,12 @@ static int gsm322_a_hplmn_search_start(struct osmocom_ms *ms, struct msgb *msg)
 /* manual mode selected */
 static int gsm322_a_sel_manual(struct osmocom_ms *ms, struct msgb *msg)
 {
-	struct msgb *nmsg;
-
 	/* restart state machine */
 	gsm322_a_switch_off(ms, msg);
 	ms->settings.plmn_mode = PLMN_MODE_MANUAL;
 	gsm322_m_switch_on(ms, msg);
 
-	nmsg = gsm48_mmevent_msgb_alloc(GSM48_MM_EVENT_USER_PLMN_SEL);
-	if (!nmsg)
-		return -ENOMEM;
-	gsm48_mmevent_msg(ms, nmsg);
+	gsm48_mmevent_input(ms, GSM48_MM_EVENT_USER_PLMN_SEL, NULL, 0);
 
 	return 0;
 }
@@ -1461,17 +1456,12 @@ static int gsm322_m_choose_plmn(struct osmocom_ms *ms, struct msgb *msg)
 /* auto mode selected */
 static int gsm322_m_sel_auto(struct osmocom_ms *ms, struct msgb *msg)
 {
-	struct msgb *nmsg;
-
 	/* restart state machine */
 	gsm322_m_switch_off(ms, msg);
 	ms->settings.plmn_mode = PLMN_MODE_AUTO;
 	gsm322_a_switch_on(ms, msg);
 
-	nmsg = gsm48_mmevent_msgb_alloc(GSM48_MM_EVENT_USER_PLMN_SEL);
-	if (!nmsg)
-		return -ENOMEM;
-	gsm48_mmevent_msg(ms, nmsg);
+	gsm48_mmevent_input(ms, GSM48_MM_EVENT_USER_PLMN_SEL, NULL, 0);
 
 	return 0;
 }
@@ -2684,14 +2674,8 @@ static int gsm322_c_any_cell_sel(struct osmocom_ms *ms, struct msgb *msg)
 	/* after re-selection, indicate no cell found */
 	if (cs->state == GSM322_C6_ANY_CELL_SEL
 	 || cs->state == GSM322_C8_ANY_CELL_RESEL) {
-		struct msgb *nmsg;
-
 		/* tell that we have no cell found */
-		nmsg = gsm48_mmevent_msgb_alloc(GSM48_MM_EVENT_NO_CELL_FOUND);
-		if (!nmsg)
-			return -ENOMEM;
-		gsm48_mmevent_msg(ms, nmsg);
-
+		gsm48_mmevent_input(ms, GSM48_MM_EVENT_NO_CELL_FOUND, NULL, 0);
 	} else { 
 		new_c_state(cs, GSM322_C6_ANY_CELL_SEL);
 	}
@@ -2737,7 +2721,6 @@ static int gsm322_c_any_cell_resel(struct osmocom_ms *ms, struct msgb *msg)
 static int gsm322_c_camp_normally(struct osmocom_ms *ms, struct msgb *msg)
 {
 	struct gsm322_cellsel *cs = &ms->cellsel;
-	struct msgb *nmsg;
 
 	LOGP(DSUM, LOGL_INFO, "Camping normally on cell (arfcn=%d mcc=%s "
 		"mnc=%s  %s, %s)\n", cs->sel_arfcn, gsm_print_mcc(cs->sel_mcc),
@@ -2745,10 +2728,7 @@ static int gsm322_c_camp_normally(struct osmocom_ms *ms, struct msgb *msg)
 		gsm_get_mnc(cs->sel_mcc, cs->sel_mnc));
 
 	/* tell that we have selected a (new) cell */
-	nmsg = gsm48_mmevent_msgb_alloc(GSM48_MM_EVENT_CELL_SELECTED);
-	if (!nmsg)
-		return -ENOMEM;
-	gsm48_mmevent_msg(ms, nmsg);
+	gsm48_mmevent_input(ms, GSM48_MM_EVENT_CELL_SELECTED, NULL, 0);
 
 	new_c_state(cs, GSM322_C3_CAMPED_NORMALLY);
 
@@ -2759,7 +2739,6 @@ static int gsm322_c_camp_normally(struct osmocom_ms *ms, struct msgb *msg)
 static int gsm322_c_camp_any_cell(struct osmocom_ms *ms, struct msgb *msg)
 {
 	struct gsm322_cellsel *cs = &ms->cellsel;
-	struct msgb *nmsg;
 
 	LOGP(DSUM, LOGL_INFO, "Camping on any cell (arfcn=%d mcc=%s "
 		"mnc=%s  %s, %s)\n", cs->sel_arfcn, gsm_print_mcc(cs->sel_mcc),
@@ -2768,10 +2747,7 @@ static int gsm322_c_camp_any_cell(struct osmocom_ms *ms, struct msgb *msg)
 
 
 	/* tell that we have selected a (new) cell */
-	nmsg = gsm48_mmevent_msgb_alloc(GSM48_MM_EVENT_CELL_SELECTED);
-	if (!nmsg)
-		return -ENOMEM;
-	gsm48_mmevent_msg(ms, nmsg);
+	gsm48_mmevent_input(ms, GSM48_MM_EVENT_CELL_SELECTED, NULL, 0);
 
 	new_c_state(cs, GSM322_C7_CAMPED_ANY_CELL);
 
@@ -2878,8 +2854,6 @@ static int gsm322_c_choose_cell(struct osmocom_ms *ms, struct msgb *msg)
 
 	/* After location updating, we choose the last cell */
 	if (gm->same_cell) {
-		struct msgb *nmsg;
-
 		if (!cs->selected) {
 			printf("No cell selected when ret.idle, please fix!\n");
 			exit(0L);
@@ -2896,10 +2870,7 @@ static int gsm322_c_choose_cell(struct osmocom_ms *ms, struct msgb *msg)
 		new_c_state(cs, GSM322_C3_CAMPED_NORMALLY);
 
 		/* tell that we have selected the cell, so RR returns IDLE */
-		nmsg = gsm48_mmevent_msgb_alloc(GSM48_MM_EVENT_CELL_SELECTED);
-		if (!nmsg)
-			return -ENOMEM;
-		gsm48_mmevent_msg(ms, nmsg);
+		gsm48_mmevent_input(ms, GSM48_MM_EVENT_CELL_SELECTED, NULL, 0);
 
 		return 0;
 	}
diff --git a/src/host/layer23/src/mobile/gsm48_mm.c b/src/host/layer23/src/mobile/gsm48_mm.c
index 4652f34..6400373 100644
--- a/src/host/layer23/src/mobile/gsm48_mm.c
+++ b/src/host/layer23/src/mobile/gsm48_mm.c
@@ -658,7 +658,7 @@ struct msgb *gsm48_mmxx_msgb_alloc(int msg_type, uint32_t ref,
 }
 
 /* allocate MM event message */
-struct msgb *gsm48_mmevent_msgb_alloc(int msg_type)
+static struct msgb *gsm48_mmevent_msgb_alloc(int msg_type)
 {
 	struct msgb *msg;
 	struct gsm48_mm_event *mme;
@@ -710,7 +710,7 @@ int gsm48_mmr_downmsg(struct osmocom_ms *ms, struct msgb *msg)
 }
 
 /* queue MM event message */
-int gsm48_mmevent_msg(struct osmocom_ms *ms, struct msgb *msg)
+static int gsm48_mmevent_msg(struct osmocom_ms *ms, struct msgb *msg)
 {
 	struct gsm48_mmlayer *mm = &ms->mmlayer;
 
@@ -905,14 +905,10 @@ static void new_mm_state(struct gsm48_mmlayer *mm, int state, int substate)
 
 	/* resend detach event, if flag is set */
 	if (state == GSM48_MM_ST_MM_IDLE && mm->delay_detach) {
-		struct msgb *nmsg;
-
 		mm->delay_detach = 0;
 
-		nmsg = gsm48_mmevent_msgb_alloc(GSM48_MM_EVENT_IMSI_DETACH);
-		if (!nmsg)
-			return;
-		gsm48_mmevent_msg(mm->ms, nmsg);
+		gsm48_mmevent_input(mm->ms, GSM48_MM_EVENT_IMSI_DETACH,
+				    NULL, 0);
 	}
 
 	/* 4.4.2 start T3212 in MM IDLE mode if not started or has expired */
@@ -2431,7 +2427,8 @@ static int gsm48_mm_rel_loc_upd_rej(struct osmocom_ms *ms, struct msgb *msg)
 	}
 	memset(&ngm, 0, sizeof(ngm));
 	ngm.reject = mm->lupd_rej_cause;
-	gsm322_event_input(ms, GSM322_EVT_PLMN, msg_type, &ngm, sizeof(ngm));
+	gsm322_event_input(ms, GSM322_EVT_PLMN, msg_type,
+			   (uint8_t *)&ngm, sizeof(ngm));
 
 	/* forbidden list */
 	switch (mm->lupd_rej_cause) {
@@ -4088,13 +4085,7 @@ static int gsm48_mmr_reg_req(struct osmocom_ms *ms)
 /* trigger detach of sim card */
 static int gsm48_mmr_nreg_req(struct osmocom_ms *ms)
 {
-	struct gsm48_mmlayer *mm = &ms->mmlayer;
-	struct msgb *nmsg;
-
-	nmsg = gsm48_mmevent_msgb_alloc(GSM48_MM_EVENT_IMSI_DETACH);
-	if (!nmsg)
-		return -ENOMEM;
-	gsm48_mmevent_msg(mm->ms, nmsg);
+	gsm48_mmevent_input(ms, GSM48_MM_EVENT_IMSI_DETACH, NULL, 0);
 
 	return 0;
 }
@@ -4121,4 +4112,22 @@ static int gsm48_rcv_mmr(struct osmocom_ms *ms, struct msgb *msg)
 	return rc;
 }
 
+int gsm48_mmevent_input(struct osmocom_ms *ms, int msg_type,
+			const uint8_t *data, unsigned int len)
+{
+	struct msgb *nmsg = gsm48_mmevent_msgb_alloc(msg_type);
+	int rc;
+
+	if (!nmsg)
+		return -ENOMEM;
 
+	if (data && len) {
+		uint8_t *cur = msgb_push(nmsg, len);
+		if (!cur) {
+			msgb_free(nmsg);
+			return -EIO;
+		}
+		memcpy(cur, data, len);
+	}
+	return gsm48_mmevent_msg(ms, nmsg);
+}
diff --git a/src/host/layer23/src/mobile/gsm48_rr.c b/src/host/layer23/src/mobile/gsm48_rr.c
index 177b272..afb53cb 100644
--- a/src/host/layer23/src/mobile/gsm48_rr.c
+++ b/src/host/layer23/src/mobile/gsm48_rr.c
@@ -1560,7 +1560,6 @@ fail:
 static int gsm48_new_sysinfo(struct osmocom_ms *ms, uint8_t type)
 {
 	struct gsm48_sysinfo *s = ms->cellsel.si;
-	struct msgb *nmsg;
 	struct gsm322_msg em;
 
 	/* update list of measurements, if BA(SACCH) is complete and new */
@@ -1600,10 +1599,7 @@ static int gsm48_new_sysinfo(struct osmocom_ms *ms, uint8_t type)
 				 (uint8_t *)&em, sizeof(em));
 
 	/* send timer info to location update process */
-	nmsg = gsm48_mmevent_msgb_alloc(GSM48_MM_EVENT_SYSINFO);
-	if (!nmsg)
-		return -ENOMEM;
-	gsm48_mmevent_msg(ms, nmsg);
+	gsm48_mmevent_input(ms, GSM48_MM_EVENT_SYSINFO, NULL, 0);
 
 	return 0;
 }
diff --git a/src/host/layer23/src/mobile/subscriber.c b/src/host/layer23/src/mobile/subscriber.c
index 3ba78f3..24d7f94 100644
--- a/src/host/layer23/src/mobile/subscriber.c
+++ b/src/host/layer23/src/mobile/subscriber.c
@@ -855,25 +855,16 @@ int gsm_subscr_generate_kc(struct osmocom_ms *ms, uint8_t key_seq,
 	if ((subscr->sim_type != GSM_SIM_TYPE_READER
 	  && subscr->sim_type != GSM_SIM_TYPE_TEST)
 	 || !subscr->sim_valid || no_sim) {
-		struct gsm48_mm_event *nmme;
+		uint8_t dummy_sres[4] = { 0x12, 0x34, 0x56, 0x78 };
 
 		LOGP(DMM, LOGL_INFO, "Sending dummy authentication response\n");
-		nmsg = gsm48_mmevent_msgb_alloc(GSM48_MM_EVENT_AUTH_RESPONSE);
-		if (!nmsg)
-			return -ENOMEM;
-		nmme = (struct gsm48_mm_event *) nmsg->data;
-		nmme->sres[0] = 0x12;
-		nmme->sres[1] = 0x34;
-		nmme->sres[2] = 0x56;
-		nmme->sres[3] = 0x78;
-		gsm48_mmevent_msg(ms, nmsg);
-
+		gsm48_mmevent_input(ms, GSM48_MM_EVENT_AUTH_RESPONSE,
+				    dummy_sres, sizeof(dummy_sres));
 		return 0;
 	}
 
 	/* test SIM */
 	if (subscr->sim_type == GSM_SIM_TYPE_TEST) {
-		struct gsm48_mm_event *nmme;
 		uint8_t sres[4];
 		struct gsm_settings *set = &ms->settings;
 
@@ -885,12 +876,8 @@ int gsm_subscr_generate_kc(struct osmocom_ms *ms, uint8_t key_seq,
 		subscr->key_seq = key_seq;
 
 		LOGP(DMM, LOGL_INFO, "Sending authentication response\n");
-		nmsg = gsm48_mmevent_msgb_alloc(GSM48_MM_EVENT_AUTH_RESPONSE);
-		if (!nmsg)
-			return -ENOMEM;
-		nmme = (struct gsm48_mm_event *) nmsg->data;
-		memcpy(nmme->sres, sres, 4);
-		gsm48_mmevent_msg(ms, nmsg);
+		gsm48_mmevent_input(ms, GSM48_MM_EVENT_AUTH_RESPONSE,
+				    sres, sizeof(sres));
 
 		return 0;
 	}
@@ -924,7 +911,6 @@ static void subscr_sim_key_cb(struct osmocom_ms *ms, struct msgb *msg)
 	uint16_t payload_len = msg->len - sizeof(*sh);
 	struct msgb *nmsg;
 	struct sim_hdr *nsh;
-	struct gsm48_mm_event *nmme;
 	uint8_t *data;
 
 	/* error handling */
@@ -961,12 +947,7 @@ static void subscr_sim_key_cb(struct osmocom_ms *ms, struct msgb *msg)
 	sim_job(ms, nmsg);
 
 	/* return signed response */
-	nmsg = gsm48_mmevent_msgb_alloc(GSM48_MM_EVENT_AUTH_RESPONSE);
-	if (!nmsg)
-		return;
-	nmme = (struct gsm48_mm_event *) nmsg->data;
-	memcpy(nmme->sres, payload, 4);
-	gsm48_mmevent_msg(ms, nmsg);
+	gsm48_mmevent_input(ms, GSM48_MM_EVENT_AUTH_RESPONSE, payload, 4);
 
 	msgb_free(msg);
 }
-- 
1.7.2.3


--Kj7319i9nmIyA2yE--




More information about the baseband-devel mailing list