Sylvain pointed out that CM SERVICE ACCEPT message is not requred, if
ciphering has been completed. In this case, an RR_SYNC_IND is sent
to mobility management, and treated there as CM SERVICE ACCEPT.
#define RR_REL_CAUSE_LOST_SIGNAL 7
#define RR_REL_CAUSE_LINK_FAILURE 8
#define RR_REL_CAUSE_LOST_SIGNAL 7
#define RR_REL_CAUSE_LINK_FAILURE 8
+#define RR_SYNC_CAUSE_CIPHERING 1
+
#define L3_ALLOC_SIZE 256
#define L3_ALLOC_HEADROOM 64
#define L3_ALLOC_SIZE 256
#define L3_ALLOC_HEADROOM 64
static int gsm48_mm_sync_ind_wait(struct osmocom_ms *ms, struct msgb *msg)
{
struct gsm48_mmlayer *mm = &ms->mmlayer;
static int gsm48_mm_sync_ind_wait(struct osmocom_ms *ms, struct msgb *msg)
{
struct gsm48_mmlayer *mm = &ms->mmlayer;
+ struct gsm48_rr_hdr *rrh = (struct gsm48_rr_hdr *)msg->data;
+
+ if (rrh->cause != RR_SYNC_CAUSE_CIPHERING) {
+ LOGP(DMM, LOGL_NOTICE, "Ignore sync indication, not waiting "
+ "for CM service\n");
+ return -EINVAL;
+ }
/* stop MM connection timer */
stop_mm_t3230(mm);
/* stop MM connection timer */
stop_mm_t3230(mm);
struct gsm_settings *set = &ms->settings;
struct msgb *nmsg;
struct gsm48_hdr *gh;
struct gsm_settings *set = &ms->settings;
struct msgb *nmsg;
struct gsm48_hdr *gh;
+ struct gsm48_rr_hdr *nrrh;
uint8_t buf[11], *tlv;
LOGP(DRR, LOGL_INFO, "CIPHERING MODE COMPLETE (cr %d)\n", cr);
uint8_t buf[11], *tlv;
LOGP(DRR, LOGL_INFO, "CIPHERING MODE COMPLETE (cr %d)\n", cr);
memcpy(tlv, buf, 2 + buf[1]);
}
memcpy(tlv, buf, 2 + buf[1]);
}
- return gsm48_send_rsl(ms, RSL_MT_DATA_REQ, nmsg);
+ gsm48_send_rsl(ms, RSL_MT_DATA_REQ, nmsg);
+
+ /* send RR_SYNC_IND(ciphering) */
+ nmsg = gsm48_rr_msgb_alloc(GSM48_RR_SYNC_IND);
+ if (!nmsg)
+ return -ENOMEM;
+ nrrh = (struct gsm48_rr_hdr *)nmsg->data;
+ nrrh->cause = RR_SYNC_CAUSE_CIPHERING;
+ return gsm48_rr_upmsg(ms, nmsg);
}
/* receive ciphering mode command */
}
/* receive ciphering mode command */