Work on Radio Ressource layer.
authorAndreas Eversberg <jolly@eversberg.eu>
Sun, 14 Mar 2010 18:23:45 +0000 (19:23 +0100)
committerAndreas Eversberg <jolly@eversberg.eu>
Sun, 14 Mar 2010 18:23:45 +0000 (19:23 +0100)
src/host/gsm48-andreas/gsm48_rr.c
src/host/gsm48-andreas/sysinfo.h

index ebac35c..c37901a 100644 (file)
@@ -1384,7 +1384,7 @@ uncomplete
  */
 
 /* decode "Cell Channel Description" (10.5.2.1b) and other frequency lists */
-static int gsm48_decode_freq_list(struct gsm_sysinfo_freq *f, uint8_t *cd, uint8_t len, uint8_t mask)
+static int gsm48_decode_freq_list(struct gsm_sysinfo_freq *f, uint8_t *cd, uint8_t len, uint8_t mask, uint8_t frqt)
 {
        int i;
 
@@ -1403,7 +1403,7 @@ static int gsm48_decode_freq_list(struct gsm_sysinfo_freq *f, uint8_t *cd, uint8
 
        /* tabula rasa */
        for (i = 0; i < 1024; i++)
-               f[i].used = 0;
+               f[i].mask &= ~frqt;
 
        /* 00..XXX. */
        if ((cd[0] & 0xc0 & mask) == 0x00) {
@@ -1412,7 +1412,7 @@ static int gsm48_decode_freq_list(struct gsm_sysinfo_freq *f, uint8_t *cd, uint8
                        return -EINVAL;
                for (i = 1; i <= 124; i++)
                        if ((cd[15 - ((i-1) >> 3)] & (1 << ((i-1) & 7))))
-                               f[i].used = 1;
+                               f[i].mask |= frqt;
 
                return 0;
        }
@@ -1432,7 +1432,7 @@ static int gsm48_decode_freq_list(struct gsm_sysinfo_freq *f, uint8_t *cd, uint8
                        return -EINVAL;
                memset(w, 0, sizeof(w));
                if (r->f0)
-                       f[0].used = 1;
+                       f[0].mask |= frqt;
                w[1] = (r->w1_hi << 8) | r->w1_lo;
                if (len >= 4)
                        w[2] = (r->w2_hi << 1) | r->w2_lo;
@@ -1465,37 +1465,37 @@ static int gsm48_decode_freq_list(struct gsm_sysinfo_freq *f, uint8_t *cd, uint8
                if (len >= 16)
                        w[16] = r->w16;
                if (w[1])
-                       f[w[1]].used = 1;
+                       f[w[1]].mask |= frqt;
                if (w[2])
-                       f[((w[1] - 512 + w[2] - 1) % 1023) + 1].used = 1;
+                       f[((w[1] - 512 + w[2] - 1) % 1023) + 1].mask |= frqt;
                if (w[3])
-                       f[((w[1]       + w[3] - 1) % 1023) + 1].used = 1;
+                       f[((w[1]       + w[3] - 1) % 1023) + 1].mask |= frqt;
                if (w[4])
-                       f[((w[1] - 512 + ((w[2] - 256 + w[4] - 1) % 511)) % 1023) + 1].used = 1;
+                       f[((w[1] - 512 + ((w[2] - 256 + w[4] - 1) % 511)) % 1023) + 1].mask |= frqt;
                if (w[5])
-                       f[((w[1]       + ((w[3] - 256 - w[5] - 1) % 511)) % 1023) + 1].used = 1;
+                       f[((w[1]       + ((w[3] - 256 - w[5] - 1) % 511)) % 1023) + 1].mask |= frqt;
                if (w[6])
-                       f[((w[1] - 512 + ((w[2]       + w[6] - 1) % 511)) % 1023) + 1].used = 1;
+                       f[((w[1] - 512 + ((w[2]       + w[6] - 1) % 511)) % 1023) + 1].mask |= frqt;
                if (w[7])
-                       f[((w[1]       + ((w[3]       + w[7] - 1) % 511)) % 1023) + 1].used = 1;
+                       f[((w[1]       + ((w[3]       + w[7] - 1) % 511)) % 1023) + 1].mask |= frqt;
                if (w[8])
-                       f[((w[1] - 512 + ((w[2] - 256 + ((w[4] - 128 + w[8] - 1) % 255)) % 511)) % 1023) + 1].used = 1;
+                       f[((w[1] - 512 + ((w[2] - 256 + ((w[4] - 128 + w[8] - 1) % 255)) % 511)) % 1023) + 1].mask |= frqt;
                if (w[9])
-                       f[((w[1]       + ((w[3] - 256 + ((w[5] - 128 + w[9] - 1) % 255)) % 511)) % 1023) + 1].used = 1;
+                       f[((w[1]       + ((w[3] - 256 + ((w[5] - 128 + w[9] - 1) % 255)) % 511)) % 1023) + 1].mask |= frqt;
                if (w[10])
-                       f[((w[1] - 512 + ((w[2]       + ((w[6] - 128 + w[10] - 1) % 255)) % 511)) % 1023) + 1].used = 1;
+                       f[((w[1] - 512 + ((w[2]       + ((w[6] - 128 + w[10] - 1) % 255)) % 511)) % 1023) + 1].mask |= frqt;
                if (w[11])
-                       f[((w[1]       + ((w[3]       + ((w[7] - 128 + w[11] - 1) % 255)) % 511)) % 1023) + 1].used = 1;
+                       f[((w[1]       + ((w[3]       + ((w[7] - 128 + w[11] - 1) % 255)) % 511)) % 1023) + 1].mask |= frqt;
                if (w[12])
-                       f[((w[1] - 512 + ((w[2] - 256 + ((w[4]       + w[12] - 1) % 255)) % 511)) % 1023) + 1].used = 1;
+                       f[((w[1] - 512 + ((w[2] - 256 + ((w[4]       + w[12] - 1) % 255)) % 511)) % 1023) + 1].mask |= frqt;
                if (w[13])
-                       f[((w[1]       + ((w[3] - 256 + ((w[5]       + w[13] - 1) % 255)) % 511)) % 1023) + 1].used = 1;
+                       f[((w[1]       + ((w[3] - 256 + ((w[5]       + w[13] - 1) % 255)) % 511)) % 1023) + 1].mask |= frqt;
                if (w[14])
-                       f[((w[1] - 512 + ((w[2]       + ((w[6]       + w[14] - 1) % 255)) % 511)) % 1023) + 1].used = 1;
+                       f[((w[1] - 512 + ((w[2]       + ((w[6]       + w[14] - 1) % 255)) % 511)) % 1023) + 1].mask |= frqt;
                if (w[15])
-                       f[((w[1]       + ((w[3]       + ((w[7]       + w[15] - 1) % 255)) % 511)) % 1023) + 1].used = 1;
+                       f[((w[1]       + ((w[3]       + ((w[7]       + w[15] - 1) % 255)) % 511)) % 1023) + 1].mask |= frqt;
                if (w[16])
-                       f[((w[1] - 512 + ((w[2] - 256 + ((w[4] - 128 + ((w[8] - 64 + w[16] - 1) % 127)) % 255)) % 511)) % 1023) + 1].used = 1;
+                       f[((w[1] - 512 + ((w[2] - 256 + ((w[4] - 128 + ((w[8] - 64 + w[16] - 1) % 127)) % 255)) % 511)) % 1023) + 1].mask |= frqt;
 
                return 0;
        }
@@ -1543,41 +1543,41 @@ static int gsm48_decode_freq_list(struct gsm_sysinfo_freq *f, uint8_t *cd, uint8
                if (len >= 16)
                        w[17] = r->w17;
                if (w[0])
-                       f[w[0]].used = 1;
+                       f[w[0]].mask |= frqt;
                if (w[1])
-                       f[(w[0] + w[1]) % 1024].used = 1;
+                       f[(w[0] + w[1]) % 1024].mask |= frqt;
                if (w[2])
-                       f[(w[0] + ((w[1] - 256 + w[2] - 1) % 511) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1] - 256 + w[2] - 1) % 511) + 1) % 1024].mask |= frqt;
                if (w[3])
-                       f[(w[0] + ((w[1]       + w[3] - 1) % 511) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1]       + w[3] - 1) % 511) + 1) % 1024].mask |= frqt;
                if (w[4])
-                       f[(w[0] + ((w[1] - 256 + ((w[2] - 128 + w[4] - 1) % 255)) % 511) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1] - 256 + ((w[2] - 128 + w[4] - 1) % 255)) % 511) + 1) % 1024].mask |= frqt;
                if (w[5])
-                       f[(w[0] + ((w[1]       + ((w[3] - 128 + w[5] - 1) % 255)) % 511) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1]       + ((w[3] - 128 + w[5] - 1) % 255)) % 511) + 1) % 1024].mask |= frqt;
                if (w[6])
-                       f[(w[0] + ((w[1] - 256 + ((w[2]       + w[6] - 1) % 255)) % 511) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1] - 256 + ((w[2]       + w[6] - 1) % 255)) % 511) + 1) % 1024].mask |= frqt;
                if (w[7])
-                       f[(w[0] + ((w[1]       + ((w[3]       + w[7] - 1) % 255)) % 511) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1]       + ((w[3]       + w[7] - 1) % 255)) % 511) + 1) % 1024].mask |= frqt;
                if (w[8])
-                       f[(w[0] + ((w[1] - 256 + ((w[2] - 128 + ((w[4] - 64 + w[8] - 1) % 127)) % 255)) % 511) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1] - 256 + ((w[2] - 128 + ((w[4] - 64 + w[8] - 1) % 127)) % 255)) % 511) + 1) % 1024].mask |= frqt;
                if (w[9])
-                       f[(w[0] + ((w[1]       + ((w[3] - 128 + ((w[5] - 64 + w[9] - 1) % 127)) % 255)) % 511) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1]       + ((w[3] - 128 + ((w[5] - 64 + w[9] - 1) % 127)) % 255)) % 511) + 1) % 1024].mask |= frqt;
                if (w[10])
-                       f[(w[0] + ((w[1] - 256 + ((w[2]       + ((w[6] - 64 + w[10] - 1) % 127)) % 255)) % 511) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1] - 256 + ((w[2]       + ((w[6] - 64 + w[10] - 1) % 127)) % 255)) % 511) + 1) % 1024].mask |= frqt;
                if (w[11])
-                       f[(w[0] + ((w[1]       + ((w[3]       + ((w[7] - 64 + w[11] - 1) % 127)) % 255)) % 511) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1]       + ((w[3]       + ((w[7] - 64 + w[11] - 1) % 127)) % 255)) % 511) + 1) % 1024].mask |= frqt;
                if (w[12])
-                       f[(w[0] + ((w[1] - 256 + ((w[2] - 128 + ((w[4]      + w[12] - 1) % 127)) % 255)) % 511) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1] - 256 + ((w[2] - 128 + ((w[4]      + w[12] - 1) % 127)) % 255)) % 511) + 1) % 1024].mask |= frqt;
                if (w[13])
-                       f[(w[0] + ((w[1]       + ((w[3] - 128 + ((w[5]      + w[13] - 1) % 127)) % 255)) % 511) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1]       + ((w[3] - 128 + ((w[5]      + w[13] - 1) % 127)) % 255)) % 511) + 1) % 1024].mask |= frqt;
                if (w[14])
-                       f[(w[0] + ((w[1] - 256 + ((w[2]       + ((w[6]      + w[14] - 1) % 127)) % 255)) % 511) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1] - 256 + ((w[2]       + ((w[6]      + w[14] - 1) % 127)) % 255)) % 511) + 1) % 1024].mask |= frqt;
                if (w[15])
-                       f[(w[0] + ((w[1]       + ((w[3]       + ((w[7]      + w[15] - 1) % 127)) % 255)) % 511) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1]       + ((w[3]       + ((w[7]      + w[15] - 1) % 127)) % 255)) % 511) + 1) % 1024].mask |= frqt;
                if (w[16])
-                       f[(w[0] + ((w[1] - 256 + ((w[2] - 128 + ((w[4] - 64 + ((w[8] - 32 + w[16] - 1) % 63)) % 127)) % 255)) % 511) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1] - 256 + ((w[2] - 128 + ((w[4] - 64 + ((w[8] - 32 + w[16] - 1) % 63)) % 127)) % 255)) % 511) + 1) % 1024].mask |= frqt;
                if (w[17])
-                       f[(w[0] + ((w[1]       + ((w[3] - 128 + ((w[5] - 64 + ((w[9] - 32 + w[17] - 1) % 63)) % 127)) % 255)) % 511) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1]       + ((w[3] - 128 + ((w[5] - 64 + ((w[9] - 32 + w[17] - 1) % 63)) % 127)) % 255)) % 511) + 1) % 1024].mask |= frqt;
 
                return 0;
        }
@@ -1633,49 +1633,49 @@ static int gsm48_decode_freq_list(struct gsm_sysinfo_freq *f, uint8_t *cd, uint8
                if (len >= 16)
                        w[21] = r->w21;
                if (w[0])
-                       f[w[0]].used = 1;
+                       f[w[0]].mask |= frqt;
                if (w[1])
-                       f[(w[0] + w[1]) % 1024].used = 1;
+                       f[(w[0] + w[1]) % 1024].mask |= frqt;
                if (w[2])
-                       f[(w[0] + ((w[1] - 128 + w[2] - 1) % 255) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1] - 128 + w[2] - 1) % 255) + 1) % 1024].mask |= frqt;
                if (w[3])
-                       f[(w[0] + ((w[1]       + w[3] - 1) % 255) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1]       + w[3] - 1) % 255) + 1) % 1024].mask |= frqt;
                if (w[4])
-                       f[(w[0] + ((w[1] - 128 + ((w[2] - 64 + w[4] - 1) % 127)) % 255) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1] - 128 + ((w[2] - 64 + w[4] - 1) % 127)) % 255) + 1) % 1024].mask |= frqt;
                if (w[5])
-                       f[(w[0] + ((w[1]       + ((w[3] - 64 + w[5] - 1) % 127)) % 255) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1]       + ((w[3] - 64 + w[5] - 1) % 127)) % 255) + 1) % 1024].mask |= frqt;
                if (w[6])
-                       f[(w[0] + ((w[1] - 128 + ((w[2]      + w[6] - 1) % 127)) % 255) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1] - 128 + ((w[2]      + w[6] - 1) % 127)) % 255) + 1) % 1024].mask |= frqt;
                if (w[7])
-                       f[(w[0] + ((w[1]       + ((w[3]      + w[7] - 1) % 127)) % 255) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1]       + ((w[3]      + w[7] - 1) % 127)) % 255) + 1) % 1024].mask |= frqt;
                if (w[8])
-                       f[(w[0] + ((w[1] - 128 + ((w[2] - 64 + ((w[4] - 32 + w[8] - 1) % 63)) % 127)) % 255) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1] - 128 + ((w[2] - 64 + ((w[4] - 32 + w[8] - 1) % 63)) % 127)) % 255) + 1) % 1024].mask |= frqt;
                if (w[9])
-                       f[(w[0] + ((w[1]       + ((w[3] - 64 + ((w[5] - 32 + w[9] - 1) % 63)) % 127)) % 255) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1]       + ((w[3] - 64 + ((w[5] - 32 + w[9] - 1) % 63)) % 127)) % 255) + 1) % 1024].mask |= frqt;
                if (w[10])
-                       f[(w[0] + ((w[1] - 128 + ((w[2]      + ((w[6] - 32 + w[10] - 1) % 63)) % 127)) % 255) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1] - 128 + ((w[2]      + ((w[6] - 32 + w[10] - 1) % 63)) % 127)) % 255) + 1) % 1024].mask |= frqt;
                if (w[11])
-                       f[(w[0] + ((w[1]       + ((w[3]      + ((w[7] - 32 + w[11] - 1) % 63)) % 127)) % 255) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1]       + ((w[3]      + ((w[7] - 32 + w[11] - 1) % 63)) % 127)) % 255) + 1) % 1024].mask |= frqt;
                if (w[12])
-                       f[(w[0] + ((w[1] - 128 + ((w[2] - 64 + ((w[4]      + w[12] - 1) % 63)) % 127)) % 255) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1] - 128 + ((w[2] - 64 + ((w[4]      + w[12] - 1) % 63)) % 127)) % 255) + 1) % 1024].mask |= frqt;
                if (w[13])
-                       f[(w[0] + ((w[1]       + ((w[3] - 64 + ((w[5]      + w[13] - 1) % 63)) % 127)) % 255) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1]       + ((w[3] - 64 + ((w[5]      + w[13] - 1) % 63)) % 127)) % 255) + 1) % 1024].mask |= frqt;
                if (w[14])
-                       f[(w[0] + ((w[1] - 128 + ((w[2]      + ((w[6]      + w[14] - 1) % 63)) % 127)) % 255) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1] - 128 + ((w[2]      + ((w[6]      + w[14] - 1) % 63)) % 127)) % 255) + 1) % 1024].mask |= frqt;
                if (w[15])
-                       f[(w[0] + ((w[1]       + ((w[3]      + ((w[7]      + w[15] - 1) % 63)) % 127)) % 255) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1]       + ((w[3]      + ((w[7]      + w[15] - 1) % 63)) % 127)) % 255) + 1) % 1024].mask |= frqt;
                if (w[16])
-                       f[(w[0] + ((w[1] - 128 + ((w[2] - 64 + ((w[4] - 32 + ((w[8] - 16 + w[16] - 1) % 31)) % 63)) % 127)) % 255) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1] - 128 + ((w[2] - 64 + ((w[4] - 32 + ((w[8] - 16 + w[16] - 1) % 31)) % 63)) % 127)) % 255) + 1) % 1024].mask |= frqt;
                if (w[17])
-                       f[(w[0] + ((w[1]       + ((w[3] - 64 + ((w[5] - 32 + ((w[9] - 16 + w[17] - 1) % 31)) % 63)) % 127)) % 255) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1]       + ((w[3] - 64 + ((w[5] - 32 + ((w[9] - 16 + w[17] - 1) % 31)) % 63)) % 127)) % 255) + 1) % 1024].mask |= frqt;
                if (w[18])
-                       f[(w[0] + ((w[1] - 128 + ((w[2]      + ((w[6] - 32 + ((w[10] - 16 + w[18] - 1) % 31)) % 63)) % 127)) % 255) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1] - 128 + ((w[2]      + ((w[6] - 32 + ((w[10] - 16 + w[18] - 1) % 31)) % 63)) % 127)) % 255) + 1) % 1024].mask |= frqt;
                if (w[19])
-                       f[(w[0] + ((w[1]       + ((w[3]      + ((w[7] - 32 + ((w[11] - 16 + w[19] - 1) % 31)) % 63)) % 127)) % 255) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1]       + ((w[3]      + ((w[7] - 32 + ((w[11] - 16 + w[19] - 1) % 31)) % 63)) % 127)) % 255) + 1) % 1024].mask |= frqt;
                if (w[20])
-                       f[(w[0] + ((w[1] - 128 + ((w[2] - 64 + ((w[4]      + ((w[12] - 16 + w[20] - 1) % 31)) % 63)) % 127)) % 255) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1] - 128 + ((w[2] - 64 + ((w[4]      + ((w[12] - 16 + w[20] - 1) % 31)) % 63)) % 127)) % 255) + 1) % 1024].mask |= frqt;
                if (w[21])
-                       f[(w[0] + ((w[1]       + ((w[3] - 64 + ((w[5]      + ((w[13] - 16 + w[21] - 1) % 31)) % 63)) % 127)) % 255) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1]       + ((w[3] - 64 + ((w[5]      + ((w[13] - 16 + w[21] - 1) % 31)) % 63)) % 127)) % 255) + 1) % 1024].mask |= frqt;
 
                return 0;
        }
@@ -1745,63 +1745,63 @@ static int gsm48_decode_freq_list(struct gsm_sysinfo_freq *f, uint8_t *cd, uint8
                if (len >= 16)
                        w[28] = r->w28;
                if (w[0])
-                       f[w[0]].used = 1;
+                       f[w[0]].mask |= frqt;
                if (w[1])
-                       f[(w[0] + w[1]) % 1024].used = 1;
+                       f[(w[0] + w[1]) % 1024].mask |= frqt;
                if (w[2])
-                       f[(w[0] + ((w[1] - 64 + w[2] - 1) % 127) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1] - 64 + w[2] - 1) % 127) + 1) % 1024].mask |= frqt;
                if (w[3])
-                       f[(w[0] + ((w[1]      + w[3] - 1) % 127) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1]      + w[3] - 1) % 127) + 1) % 1024].mask |= frqt;
                if (w[4])
-                       f[(w[0] + ((w[1] - 64 + ((w[2] - 32 + w[4] - 1) % 63)) % 127) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1] - 64 + ((w[2] - 32 + w[4] - 1) % 63)) % 127) + 1) % 1024].mask |= frqt;
                if (w[5])
-                       f[(w[0] + ((w[1]      + ((w[3] - 32 + w[5] - 1) % 63)) % 127) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1]      + ((w[3] - 32 + w[5] - 1) % 63)) % 127) + 1) % 1024].mask |= frqt;
                if (w[6])
-                       f[(w[0] + ((w[1] - 64 + ((w[2]      + w[6] - 1) % 63)) % 127) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1] - 64 + ((w[2]      + w[6] - 1) % 63)) % 127) + 1) % 1024].mask |= frqt;
                if (w[7])
-                       f[(w[0] + ((w[1]      + ((w[3]      + w[7] - 1) % 63)) % 127) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1]      + ((w[3]      + w[7] - 1) % 63)) % 127) + 1) % 1024].mask |= frqt;
                if (w[8])
-                       f[(w[0] + ((w[1] - 64 + ((w[2] - 32 + ((w[4] - 16 + w[8] - 1) % 31)) % 63)) % 127) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1] - 64 + ((w[2] - 32 + ((w[4] - 16 + w[8] - 1) % 31)) % 63)) % 127) + 1) % 1024].mask |= frqt;
                if (w[9])
-                       f[(w[0] + ((w[1]      + ((w[3] - 32 + ((w[5] - 16 + w[9] - 1) % 31)) % 63)) % 127) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1]      + ((w[3] - 32 + ((w[5] - 16 + w[9] - 1) % 31)) % 63)) % 127) + 1) % 1024].mask |= frqt;
                if (w[10])
-                       f[(w[0] + ((w[1] - 64 + ((w[2]      + ((w[6] - 16 + w[10] - 1) % 31)) % 63)) % 127) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1] - 64 + ((w[2]      + ((w[6] - 16 + w[10] - 1) % 31)) % 63)) % 127) + 1) % 1024].mask |= frqt;
                if (w[11])
-                       f[(w[0] + ((w[1]      + ((w[3]      + ((w[7] - 16 + w[11] - 1) % 31)) % 63)) % 127) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1]      + ((w[3]      + ((w[7] - 16 + w[11] - 1) % 31)) % 63)) % 127) + 1) % 1024].mask |= frqt;
                if (w[12])
-                       f[(w[0] + ((w[1] - 64 + ((w[2] - 32 + ((w[4]      + w[12] - 1) % 31)) % 63)) % 127) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1] - 64 + ((w[2] - 32 + ((w[4]      + w[12] - 1) % 31)) % 63)) % 127) + 1) % 1024].mask |= frqt;
                if (w[13])
-                       f[(w[0] + ((w[1]      + ((w[3] - 32 + ((w[5]      + w[13] - 1) % 31)) % 63)) % 127) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1]      + ((w[3] - 32 + ((w[5]      + w[13] - 1) % 31)) % 63)) % 127) + 1) % 1024].mask |= frqt;
                if (w[14])
-                       f[(w[0] + ((w[1] - 64 + ((w[2]      + ((w[6]      + w[14] - 1) % 31)) % 63)) % 127) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1] - 64 + ((w[2]      + ((w[6]      + w[14] - 1) % 31)) % 63)) % 127) + 1) % 1024].mask |= frqt;
                if (w[15])
-                       f[(w[0] + ((w[1]      + ((w[3]      + ((w[7]      + w[15] - 1) % 31)) % 63)) % 127) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1]      + ((w[3]      + ((w[7]      + w[15] - 1) % 31)) % 63)) % 127) + 1) % 1024].mask |= frqt;
                if (w[16])
-                       f[(w[0] + ((w[1] - 64 + ((w[2] - 32 + ((w[4] - 16 + ((w[8] - 8 + w[16] - 1) % 15)) % 31)) % 63)) % 127) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1] - 64 + ((w[2] - 32 + ((w[4] - 16 + ((w[8] - 8 + w[16] - 1) % 15)) % 31)) % 63)) % 127) + 1) % 1024].mask |= frqt;
                if (w[17])
-                       f[(w[0] + ((w[1]      + ((w[3] - 32 + ((w[5] - 16 + ((w[9] - 8 + w[17] - 1) % 15)) % 31)) % 63)) % 127) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1]      + ((w[3] - 32 + ((w[5] - 16 + ((w[9] - 8 + w[17] - 1) % 15)) % 31)) % 63)) % 127) + 1) % 1024].mask |= frqt;
                if (w[18])
-                       f[(w[0] + ((w[1] - 64 + ((w[2]      + ((w[6] - 16 + ((w[10] - 8 + w[18] - 1) % 15)) % 31)) % 63)) % 127) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1] - 64 + ((w[2]      + ((w[6] - 16 + ((w[10] - 8 + w[18] - 1) % 15)) % 31)) % 63)) % 127) + 1) % 1024].mask |= frqt;
                if (w[19])
-                       f[(w[0] + ((w[1]      + ((w[3]      + ((w[7] - 16 + ((w[11] - 8 + w[19] - 1) % 15)) % 31)) % 63)) % 127) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1]      + ((w[3]      + ((w[7] - 16 + ((w[11] - 8 + w[19] - 1) % 15)) % 31)) % 63)) % 127) + 1) % 1024].mask |= frqt;
                if (w[20])
-                       f[(w[0] + ((w[1] - 64 + ((w[2] - 32 + ((w[4]      + ((w[12] - 8 + w[20] - 1) % 15)) % 31)) % 63)) % 127) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1] - 64 + ((w[2] - 32 + ((w[4]      + ((w[12] - 8 + w[20] - 1) % 15)) % 31)) % 63)) % 127) + 1) % 1024].mask |= frqt;
                if (w[21])
-                       f[(w[0] + ((w[1]      + ((w[3] - 32 + ((w[5]      + ((w[13] - 8 + w[21] - 1) % 15)) % 31)) % 63)) % 127) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1]      + ((w[3] - 32 + ((w[5]      + ((w[13] - 8 + w[21] - 1) % 15)) % 31)) % 63)) % 127) + 1) % 1024].mask |= frqt;
                if (w[22])
-                       f[(w[0] + ((w[1] - 64 + ((w[2]      + ((w[6]      + ((w[14] - 8 + w[22] - 1) % 15)) % 31)) % 63)) % 127) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1] - 64 + ((w[2]      + ((w[6]      + ((w[14] - 8 + w[22] - 1) % 15)) % 31)) % 63)) % 127) + 1) % 1024].mask |= frqt;
                if (w[23])
-                       f[(w[0] + ((w[1]      + ((w[3]      + ((w[7]      + ((w[15] - 8 + w[23] - 1) % 15)) % 31)) % 63)) % 127) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1]      + ((w[3]      + ((w[7]      + ((w[15] - 8 + w[23] - 1) % 15)) % 31)) % 63)) % 127) + 1) % 1024].mask |= frqt;
                if (w[24])
-                       f[(w[0] + ((w[1] - 64 + ((w[2] - 32 + ((w[4] - 16 + ((w[8]     + w[24] - 1) % 15)) % 31)) % 63)) % 127) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1] - 64 + ((w[2] - 32 + ((w[4] - 16 + ((w[8]     + w[24] - 1) % 15)) % 31)) % 63)) % 127) + 1) % 1024].mask |= frqt;
                if (w[25])
-                       f[(w[0] + ((w[1]      + ((w[3] - 32 + ((w[5] - 16 + ((w[9]     + w[25] - 1) % 15)) % 31)) % 63)) % 127) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1]      + ((w[3] - 32 + ((w[5] - 16 + ((w[9]     + w[25] - 1) % 15)) % 31)) % 63)) % 127) + 1) % 1024].mask |= frqt;
                if (w[26])
-                       f[(w[0] + ((w[1] - 64 + ((w[2]      + ((w[6] - 16 + ((w[10]     + w[26] - 1) % 15)) % 31)) % 63)) % 127) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1] - 64 + ((w[2]      + ((w[6] - 16 + ((w[10]     + w[26] - 1) % 15)) % 31)) % 63)) % 127) + 1) % 1024].mask |= frqt;
                if (w[27])
-                       f[(w[0] + ((w[1]      + ((w[3]      + ((w[7] - 16 + ((w[11]     + w[27] - 1) % 15)) % 31)) % 63)) % 127) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1]      + ((w[3]      + ((w[7] - 16 + ((w[11]     + w[27] - 1) % 15)) % 31)) % 63)) % 127) + 1) % 1024].mask |= frqt;
                if (w[28])
-                       f[(w[0] + ((w[1] - 64 + ((w[2] - 32 + ((w[4]      + ((w[12]     + w[28] - 1) % 15)) % 31)) % 63)) % 127) + 1) % 1024].used = 1;
+                       f[(w[0] + ((w[1] - 64 + ((w[2] - 32 + ((w[4]      + ((w[12]     + w[28] - 1) % 15)) % 31)) % 63)) % 127) + 1) % 1024].mask |= frqt;
 
                return 0;
        }
@@ -1814,10 +1814,10 @@ static int gsm48_decode_freq_list(struct gsm_sysinfo_freq *f, uint8_t *cd, uint8
                if (len < 3)
                        return -EINVAL;
                orig = (r->orig_arfcn_hi << 9) || (r->orig_arfcn_mid << 1) || r->orig_arfcn_lo;
-               f[orig].used = 1;
+               f[orig].mask |= frqt;
                for (i = 1; 2 + (i >> 3) < len; i++)
                        if ((cd[2 + (i >> 3)] & (0x80 >> (i & 7))))
-                               f[(orig + 1) % 1024].used = 1;
+                               f[(orig + 1) % 1024].mask |= frqt;
 
                return 0;
        }
@@ -1919,7 +1919,7 @@ static int gsm_rr_rx_sysinfo1(struct osmocom_ms *ms, struct msgb *msg)
        }
        /* Cell Channel Description */
        gsm48_decode_freq_list(s->freq, si->cell_channel_description,
-               sizeof(si->cell_channel_description), 0xce);
+               sizeof(si->cell_channel_description), 0xce, FREQ_TYPE_SERV);
        /* RACH Control Parameter */
        gsm48_decode_rach_ctl_param(s, si->rach_control);
        /* SI 1 Rest Octets */
@@ -1943,8 +1943,8 @@ static int gsm_rr_rx_sysinfo2(struct osmocom_ms *ms, struct msgb *msg)
                return -EINVAL;
        }
        /* Neighbor Cell Description */
-       gsm48_decode_freq_list(s->nb_freq, si->bcch_frequency_list,
-               sizeof(si->bcch_frequency_list), 0xce);
+       gsm48_decode_freq_list(s->freq, si->bcch_frequency_list,
+               sizeof(si->bcch_frequency_list), 0xce, FREQ_TYPE_NCELL);
        /* NCC Permitted */
        s->ncc_permitted = si->ncc_permitted;
        /* RACH Control Parameter */
@@ -1969,8 +1969,8 @@ static int gsm_rr_rx_sysinfo2bis(struct osmocom_ms *ms, struct msgb *msg)
        /* Neighbor Cell Description */
        s->ext_ind = (si->bcch_frequency_list[0] >> 6) & 1;
        s->ba_ind = (si->bcch_frequency_list[0] >> 5) & 1;
-       gsm48_decode_freq_list(s->nb_freq, si->ext_bcch_frequency_list,
-               sizeof(si->ext_bcch_frequency_list), 0x8e);
+       gsm48_decode_freq_list(s->freq, si->ext_bcch_frequency_list,
+               sizeof(si->ext_bcch_frequency_list), 0x8e, FREQ_TYPE_NCELL);
        /* RACH Control Parameter */
        gsm48_decode_rach_ctl_neigh(s, si->rach_control);
 
@@ -1992,8 +1992,8 @@ static int gsm_rr_rx_sysinfo2ter(struct osmocom_ms *ms, struct msgb *msg)
        }
        /* Neighbor Cell Description 2 */
        s->multi_rep = (si->bcch_frequency_list[0] >> 6) & 3;
-       gsm48_decode_freq_list(s->nb_freq, si->ext_bcch_frequency_list,
-               sizeof(si->ext_bcch_frequency_list), 0x8e);
+       gsm48_decode_freq_list(s->freq, si->ext_bcch_frequency_list,
+               sizeof(si->ext_bcch_frequency_list), 0x8e, FREQ_TYPE_NCELL);
 
        return 0;
 }
index 4a65920..2759121 100644 (file)
 
 /* collection of system information of the current cell */
 
+/* frequency mask flags of frequency type */
+#define        FREQ_TYPE_SERV  (1 << 0)
+#define        FREQ_TYPE_NCELL (1 << 1)
+
+/* structure of one frequency */
 struct gsm_sysinfo_freq {
        /* if the frequency included in the sysinfo */
-       uint8_t used;
+       uint8_t mask;
        /* the power measured as real value */
-       int8_t  power;
+       int8_t  rxlev;
        ...
 };
 
+/* structure of all received system informations */
 struct gsm_sysinfo {
-       /* serving cell */
        struct  gsm_sysinfo_freq        freq[1024];
+
+       /* serving cell */
        uint8_t                         max_retrans; /* decoded */
        uint8_t                         tx_integer; /* decoded */
        uint8_t                         reest_denied; /* 1 = denied */
@@ -39,7 +46,6 @@ struct gsm_sysinfo {
        uint8_t                         class_barr[16]; /* 10 is emergency */
 
        /* neighbor cell */
-       struct  gsm_sysinfo_freq        nb_freq[1024];
        uint8_t                         nb_ext_ind;
        uint8_t                         nb_ba_ind;
        uint8_t                         nb_multi_rep; /* see GSM 05.08 8.4.3 */