OsmocomBB源码分析--main
文章目录
整体
基于接口,GSM信令协议组装成三个通用层:
- 第1层:物理层。 它使用空中接口上的通道结构。
- 第2层:数据链路层。 在Um接口上,数据链路层是用于ISDN中的D信道(LAP-D)协议的链路访问协议的修改版本,在Dm信道上称为链路访问协议(LAP-Dm)。 在A接口上,使用消息传输部分(MTP),SS7的第2层。
- 第3层:GSM信令协议的第三层分为三个子层:
- 无线电资源管理(RR),
- 流动性管理(MM)
- 连接管理(CM)。
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);
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
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)
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