OsmocomBB源码分析--main

整体

OsmocomBB源码分析--main
基于接口,GSM信令协议组装成三个通用层:

  1. 第1层:物理层。 它使用空中接口上的通道结构。
  2. 第2层:数据链路层。 在Um接口上,数据链路层是用于ISDN中的D信道(LAP-D)协议的链路访问协议的修改版本,在Dm信道上称为链路访问协议(LAP-Dm)。 在A接口上,使用消息传输部分(MTP),SS7的第2层。
  3. 第3层:GSM信令协议的第三层分为三个子层:
    - 无线电资源管理(RR),
    - 流动性管理(MM)
    - 连接管理(CM)。

OsmocomBB源码分析--main

OsmocomBB源码分析--main
OsmocomBB源码分析--main

gsm48_rsl_dequeue

RSL = Radio Signalling Link

/* dequeue messages (RSL-SAP) */
int gsm48_rsl_dequeue(struct osmocom_ms *ms)
	struct gsm48_rrlayer *rr = &ms->rrlayer;
	while ((msg = msgb_dequeue(&rr->rsl_upqueue))) {
		/* msg is freed there */
		gsm48_rcv_rsl(ms, msg);

OsmocomBB源码分析--main

static int gsm48_rcv_rll(struct osmocom_ms *ms, struct msgb *msg)
	struct gsm48_rrlayer *rr = &ms->rrlayer;
	struct abis_rsl_rll_hdr *rllh = msgb_l2(msg);
	int msg_type = rllh->c.msg_type;
	int link_id = rllh->link_id;
	/* find function for current state and message */
	if (!(link_id & 7)) {
		/* SAPI 0 */
		for (i = 0; i < DLDATASLLEN; i++)
			if ((msg_type == dldatastatelist[i].type)
			 && ((1 << rr->state) & dldatastatelist[i].states))
				break;
		rc = dldatastatelist[i].rout(ms, msg);
	} else {
		/* SAPI 3 */
		for (i = 0; i < DLDATASLLENS3; i++)
			if ((msg_type == dldatastatelists3[i].type)
			 && ((1 << rr->sapi3_state) &
			     dldatastatelists3[i].states))
				break;
		rc = dldatastatelists3[i].rout(ms, msg);

dldatastatelist
dldatastatelists3

gsm48_RR_dequeue

/* dequeue messages (RR-SAP) */
int gsm48_rr_dequeue(struct osmocom_ms *ms)
	while ((msg = msgb_dequeue(&mm->rr_upqueue))) {
		/* msg is freed there */
		gsm48_rcv_rr(ms, msg);

static int gsm48_rcv_rr(struct osmocom_ms *ms, struct msgb *msg)
	/* find function for current state and message */
	for (i = 0; i < RRDATASLLEN; i++)
		if ((msg_type == rrdatastatelist[i].type)
		 && ((1 << mm->state) & rrdatastatelist[i].states))
			break;
	rc = rrdatastatelist[i].rout(ms, msg);

rrdatastatelist
OsmocomBB源码分析--main

gsm48_mmxx_dequeue

/* dequeue messages (MMxx-SAP) */
int gsm48_mmxx_dequeue(struct osmocom_ms *ms)

static int gsm48_mm_data_ind(struct osmocom_ms *ms, struct msgb *msg)

int gsm48_mmxx_downmsg(struct osmocom_ms *ms, struct msgb *msg)

OsmocomBB源码分析--main
OsmocomBB源码分析--main

MMxx-SAP(MMCC/MMSS/MMSMS)

/* queue message (MMxx-SAP) */
int gsm48_mmxx_upmsg(struct osmocom_ms *ms, struct msgb *msg)
	msgb_enqueue(&mm->mmxx_upqueue, msg);

/* dequeue messages (MMxx-SAP) */
int gsm48_mmxx_dequeue(struct osmocom_ms *ms)
	while ((msg = msgb_dequeue(&mm->mmxx_upqueue))) {
		mmh = (struct gsm48_mmxx_hdr *) msg->data;
		switch (mmh->msg_type & GSM48_MMXX_MASK) {
		case GSM48_MMCC_CLASS:
			gsm48_rcv_cc(ms, msg);
			break;
		case GSM48_MMSS_CLASS:
			gsm480_rcv_ss(ms, msg);
			break;
		case GSM48_MMSMS_CLASS:
			gsm411_rcv_sms(ms, msg);
			break;
		}
		msgb_free(msg);

CC/SS/SMS详细分析见 https://blog.****.net/mouse1598189/article/details/86704041

int gsm48_mmxx_downmsg(struct osmocom_ms *ms, struct msgb *msg)
	/* Find function for current state and message */
	for (i = 0; i < DOWNSLLEN; i++)
		if ((msg_type == downstatelist[i].type)
		 && ((1 << mm->state) & downstatelist[i].states)
		 && ((1 << mm->substate) & downstatelist[i].substates))
			break;
	rc = downstatelist[i].rout(ms, msg);

downstatelist

gsm48_mmr_dequeue

MMR-SAP

/* queue message (MMR-SAP) */
int gsm48_mmr_downmsg(struct osmocom_ms *ms, struct msgb *msg)
	msgb_enqueue(&mm->mmr_downqueue, msg);

/* dequeue messages (MMR-SAP) */
int gsm48_mmr_dequeue(struct osmocom_ms *ms)
	while ((msg = msgb_dequeue(&mm->mmr_downqueue))) {
		gsm48_rcv_mmr(ms, msg);
		msgb_free(msg);

static int gsm48_rcv_mmr(struct osmocom_ms *ms, struct msgb *msg)
	struct gsm48_mmr *mmr = (struct gsm48_mmr *)msg->data;
	int msg_type = mmr->msg_type;
	switch(msg_type) {
		case GSM48_MMR_REG_REQ:
			rc = gsm48_mmr_reg_req(ms); /* register new SIM card and trigger attach */
			break;
		case GSM48_MMR_NREG_REQ:
			rc = gsm48_mmr_nreg_req(ms);/* trigger detach of sim card */
			break;
		default:
			LOGP(DMM, LOGL_NOTICE, "Message unhandled.\n");

gsm48_mmevent_dequeue

/* queue MM event message */
int gsm48_mmevent_msg(struct osmocom_ms *ms, struct msgb *msg)
	msgb_enqueue(&mm->event_queue, msg);  

/* dequeue MM event messages */
int gsm48_mmevent_dequeue(struct osmocom_ms *ms)
	while ((msg = msgb_dequeue(&mm->event_queue))) {
		mme = (struct gsm48_mm_event *) msg->data;
		gsm48_mm_ev(ms, mme->msg_type, msg);
		msgb_free(msg);

static int gsm48_mm_ev(struct osmocom_ms *ms, int msg_type, struct msgb *msg)
	/* Find function for current state and message */
	for (i = 0; i < EVENTSLLEN; i++)
		if ((msg_type == eventstatelist[i].type)
		 && ((1 << mm->state) & eventstatelist[i].states)
		 && ((1 << mm->substate) & eventstatelist[i].substates))
			break;
	rc = eventstatelist[i].rout(ms, msg);

eventstatelist

gsm322_plmn_dequeue

gsm322_cs_dequeue

gsm_sim_job_dequeue

mncc_dequeue