[layer23] Fixed A5/1 support coding
authorAndreas.Eversberg <jolly@eversberg.eu>
Wed, 15 Sep 2010 14:21:06 +0000 (14:21 +0000)
committerAndreas.Eversberg <jolly@eversberg.eu>
Wed, 15 Sep 2010 14:21:06 +0000 (14:21 +0000)
Dieter pointed out that A5/1 is indicated as supported, if the A5/1 bit in
the classmark IE is 0.

src/host/layer23/src/mobile/gsm48_mm.c
src/host/layer23/src/mobile/gsm48_rr.c

index 10767d5..dfc41d4 100644 (file)
@@ -297,7 +297,7 @@ int gsm48_encode_classmark1(struct gsm48_classmark1 *cm, uint8_t rev_lev,
        memset(cm, 0, sizeof(*cm));
        cm->rev_lev = rev_lev;
        cm->es_ind = es_ind;
-       cm->a5_1 = a5_1;
+       cm->a5_1 = !a5_1;
        cm->pwr_lev = pwr_lev;
 
        return 0;
index 125465f..3d0245b 100644 (file)
@@ -848,12 +848,12 @@ static int gsm48_rr_rx_cip_mode_cmd(struct osmocom_ms *ms, struct msgb *msg)
        /* cipher mode response */
        cr = cm->cr;
 
-       if (sc)
-               LOGP(DRR, LOGL_INFO, "CIPHERING MODE COMMAND (sc=%u, cr=%u)",
+       if (!sc)
+               LOGP(DRR, LOGL_INFO, "CIPHERING MODE COMMAND (sc=%u, cr=%u)\n",
                        sc, cr);
        else
                LOGP(DRR, LOGL_INFO, "CIPHERING MODE COMMAND (sc=%u, "
-                       "algo=A5/%d cr=%u)", sc, alg_id + 1, cr);
+                       "algo=A5/%d cr=%u)\n", sc, alg_id + 1, cr);
 
        /* 3.4.7.2 */
        if (rr->cipher_on && sc) {
@@ -863,15 +863,17 @@ static int gsm48_rr_rx_cip_mode_cmd(struct osmocom_ms *ms, struct msgb *msg)
        }
 
        /* check if we actually support this cipher */
-       if ((alg_id == GSM_CIPHER_A5_1 && !sup->a5_1)
-        || (alg_id == GSM_CIPHER_A5_2 && !sup->a5_2)
-        || (alg_id == GSM_CIPHER_A5_3 && !sup->a5_3)
-        || (alg_id == GSM_CIPHER_A5_4 && !sup->a5_4)
-        || (alg_id == GSM_CIPHER_A5_5 && !sup->a5_5)
-        || (alg_id == GSM_CIPHER_A5_6 && !sup->a5_6)
-        || (alg_id == GSM_CIPHER_A5_7 && !sup->a5_7))
+       if (sc && ((alg_id == GSM_CIPHER_A5_1 && !sup->a5_1)
+               || (alg_id == GSM_CIPHER_A5_2 && !sup->a5_2)
+               || (alg_id == GSM_CIPHER_A5_3 && !sup->a5_3)
+               || (alg_id == GSM_CIPHER_A5_4 && !sup->a5_4)
+               || (alg_id == GSM_CIPHER_A5_5 && !sup->a5_5)
+               || (alg_id == GSM_CIPHER_A5_6 && !sup->a5_6)
+               || (alg_id == GSM_CIPHER_A5_7 && !sup->a5_7))) {
+               LOGP(DRR, LOGL_NOTICE, "algo not supported\n");
                return gsm48_rr_tx_rr_status(ms,
                        GSM48_RR_CAUSE_CHAN_MODE_UNACCT);
+       }
 
        /* check if we have no key */
        if (sc && subscr->key_seq == 7) {
@@ -1018,7 +1020,7 @@ int gsm48_rr_enc_cm2(struct osmocom_ms *ms, struct gsm48_classmark2 *cm)
                cm->pwr_lev = sup->pwr_lev_1800;
        else
                cm->pwr_lev = sup->pwr_lev_900;
-       cm->a5_1 = sup->a5_1;
+       cm->a5_1 = !sup->a5_1;
        cm->es_ind = sup->es_ind;
        cm->rev_lev = sup->rev_lev;
        cm->fc = (sup->r_gsm || sup->e_gsm);