summaryrefslogtreecommitdiffstats
path: root/src/host/gsm48-andreas
diff options
context:
space:
mode:
authorAndreas Eversberg <jolly@eversberg.eu>2010-03-15 20:15:40 +0100
committerAndreas Eversberg <jolly@eversberg.eu>2010-03-15 20:15:40 +0100
commite5a58a58eb0966c5e477bdd4112ee64c22344a67 (patch)
treecaeb1d06df506905b0ab2f2afcff2f57d626754a /src/host/gsm48-andreas
parent79ed5824fb8c8674672c660a72dd63db677d1ff3 (diff)
Work on Radio Ressource
- SI 5, 5bis, 5ter
Diffstat (limited to 'src/host/gsm48-andreas')
-rw-r--r--src/host/gsm48-andreas/extra.h15
-rw-r--r--src/host/gsm48-andreas/gsm48_rr.c92
-rw-r--r--src/host/gsm48-andreas/sysinfo.h12
3 files changed, 105 insertions, 14 deletions
diff --git a/src/host/gsm48-andreas/extra.h b/src/host/gsm48-andreas/extra.h
index 11467537..248c3768 100644
--- a/src/host/gsm48-andreas/extra.h
+++ b/src/host/gsm48-andreas/extra.h
@@ -405,6 +405,21 @@ struct gsm48_system_information_type_2ter {
uint8_t rest_octets[0];
} __attribute__ ((packed));
+/* Section 9.1.38 System information Type 5bis */
+struct gsm48_system_information_type_5bis {
+ uint8_t rr_protocol_discriminator :4,
+ skip_indicator:4;
+ uint8_t system_information;
+ uint8_t bcch_frequency_list[16];
+} __attribute__ ((packed));
+
+/* Section 9.1.39 System information Type 5ter */
+struct gsm48_system_information_type_5ter {
+ uint8_t rr_protocol_discriminator :4,
+ skip_indicator:4;
+ uint8_t system_information;
+ uint8_t bcch_frequency_list[16];
+} __attribute__ ((packed));
rsl.h:
diff --git a/src/host/gsm48-andreas/gsm48_rr.c b/src/host/gsm48-andreas/gsm48_rr.c
index 5a924b83..fb3beb19 100644
--- a/src/host/gsm48-andreas/gsm48_rr.c
+++ b/src/host/gsm48-andreas/gsm48_rr.c
@@ -1821,6 +1821,10 @@ static int gsm48_decode_mobile_alloc(struct gsm48_sysinfo *s, uint8_t *ma, uint8
int i, j = 0;
uint16_t f[len << 3];
+ /* not more than 64 hopping indexes allowed in IE */
+ if (len > 8)
+ return -EINVAL;
+
/* tabula rasa */
s->hopp_len = 0;
@@ -1903,6 +1907,11 @@ static int gsm48_decode_si3_rest(struct gsm48_sysinfo *s, uint8_t *si, uint8_t l
{
}
+/* decode "SI 4 Rest Octets" (10.5.2.35) */
+static int gsm48_decode_si4_rest(struct gsm48_sysinfo *s, uint8_t *si, uint8_t len)
+{
+}
+
todo: add to unit data ind switch-case state
/* receive "SYSTEM INFORMATION 1" message (9.1.31) */
@@ -1943,9 +1952,9 @@ static int gsm_rr_rx_sysinfo2(struct osmocom_ms *ms, struct msgb *msg)
}
/* Neighbor Cell Description */
gsm48_decode_freq_list(s->freq, si->bcch_frequency_list,
- sizeof(si->bcch_frequency_list), 0xce, FREQ_TYPE_NCELL);
+ sizeof(si->bcch_frequency_list), 0xce, FREQ_TYPE_NCELL_2);
/* NCC Permitted */
- s->ncc_permitted = si->ncc_permitted;
+ s->nb_ncc_permitted = si->ncc_permitted;
/* RACH Control Parameter */
gsm48_decode_rach_ctl_neigh(s, si->rach_control);
@@ -1965,10 +1974,10 @@ static int gsm_rr_rx_sysinfo2bis(struct osmocom_ms *ms, struct msgb *msg)
return -EINVAL;
}
/* Neighbor Cell Description */
- s->ext_ind = (si->bcch_frequency_list[0] >> 6) & 1;
- s->ba_ind = (si->bcch_frequency_list[0] >> 5) & 1;
+ s->nb_ext_ind = (si->bcch_frequency_list[0] >> 6) & 1;
+ s->nb_ba_ind = (si->bcch_frequency_list[0] >> 5) & 1;
gsm48_decode_freq_list(s->freq, si->ext_bcch_frequency_list,
- sizeof(si->ext_bcch_frequency_list), 0x8e, FREQ_TYPE_NCELL);
+ sizeof(si->ext_bcch_frequency_list), 0x8e, FREQ_TYPE_NCELL_2bis);
/* RACH Control Parameter */
gsm48_decode_rach_ctl_neigh(s, si->rach_control);
@@ -1989,9 +1998,9 @@ static int gsm_rr_rx_sysinfo2ter(struct osmocom_ms *ms, struct msgb *msg)
return -EINVAL;
}
/* Neighbor Cell Description 2 */
- s->multi_rep = (si->bcch_frequency_list[0] >> 6) & 3;
+ s->nb_multi_rep = (si->bcch_frequency_list[0] >> 6) & 3;
gsm48_decode_freq_list(s->freq, si->ext_bcch_frequency_list,
- sizeof(si->ext_bcch_frequency_list), 0x8e, FREQ_TYPE_NCELL);
+ sizeof(si->ext_bcch_frequency_list), 0x8e, FREQ_TYPE_NCELL_2ter);
return 0;
}
@@ -2020,7 +2029,7 @@ static int gsm_rr_rx_sysinfo3(struct osmocom_ms *ms, struct msgb *msg)
gsm48_decode_cell_sel_param(s, si->cell_sel_par);
/* RACH Control Parameter */
gsm48_decode_rach_ctl_param(s, si->rach_control);
- /* SI 1 Rest Octets */
+ /* SI 3 Rest Octets */
if (payload_len >= 4)
gsm48_decode_si3_rest(si->rest_octets, payload_len);
@@ -2056,14 +2065,73 @@ static int gsm_rr_rx_sysinfo4(struct osmocom_ms *ms, struct msgb *msg)
}
/* Cell Options (BCCH) */
gsm48_decode_cellopt(s, si->control_channel_desc);
- /* SI 1 Rest Octets */
- if (payload_len >= 4)
- gsm48_decode_si3_rest(si->rest_octets, payload_len);
+ /* SI 4 Rest Octets */
+ if (payload_len >= 4 + 1 + si->data[5])
+ gsm48_decode_si3_rest(si->rest_octets,
+ payload_len - 4 - 1 - si->data[5]);
+
+ return 0;
+}
+
+todo: frequency list and extension processing: may we delete all frequencies in this category, or just the ones from this special system information?:
+
+todo: add to unit data ind switch-case state
+/* receive "SYSTEM INFORMATION 5" message (9.1.37) */
+static int gsm_rr_rx_sysinfo5(struct osmocom_ms *ms, struct msgb *msg)
+{
+ struct gsm48_system_information_type_5 *si = msgb_l3(msg);
+ struct gsm48_sysinfo *s = ms->sysinfo;
+ int payload_len = msgb_l3len(msg) - sizeof(*si);
+
+ if (payload_len < 0) {
+ DEBUGP(DRR, "Short read of SYSTEM INFORMATION 5 message.\n");
+ return -EINVAL;
+ }
+ /* Neighbor Cell Description */
+ gsm48_decode_freq_list(s->freq, si->bcch_frequency_list,
+ sizeof(si->bcch_frequency_list), 0xce, FREQ_TYPE_REP_5);
+
+ return 0;
+}
+
+todo: add to unit data ind switch-case state
+/* receive "SYSTEM INFORMATION 5bis" message (9.1.38) */
+static int gsm_rr_rx_sysinfo5bis(struct osmocom_ms *ms, struct msgb *msg)
+{
+ struct gsm48_system_information_type_5bis *si = msgb_l3(msg);
+ struct gsm48_sysinfo *s = ms->sysinfo;
+ int payload_len = msgb_l3len(msg) - sizeof(*si);
+
+ if (payload_len < 0) {
+ DEBUGP(DRR, "Short read of SYSTEM INFORMATION 5bis message.\n");
+ return -EINVAL;
+ }
+ /* Neighbor Cell Description */
+ gsm48_decode_freq_list(s->freq, si->bcch_frequency_list,
+ sizeof(si->bcch_frequency_list), 0xce, FREQ_TYPE_REP_5bis);
+
+ return 0;
+}
+
+todo: add to unit data ind switch-case state
+/* receive "SYSTEM INFORMATION 5ter" message (9.1.39) */
+static int gsm_rr_rx_sysinfo5ter(struct osmocom_ms *ms, struct msgb *msg)
+{
+ struct gsm48_system_information_type_5ter *si = msgb_l3(msg);
+ struct gsm48_sysinfo *s = ms->sysinfo;
+ int payload_len = msgb_l3len(msg) - sizeof(*si);
+
+ if (payload_len < 0) {
+ DEBUGP(DRR, "Short read of SYSTEM INFORMATION 5ter message.\n");
+ return -EINVAL;
+ }
+ /* Neighbor Cell Description */
+ gsm48_decode_freq_list(s->freq, si->bcch_frequency_list,
+ sizeof(si->bcch_frequency_list), 0xce, FREQ_TYPE_REP_5ter);
return 0;
}
-today: decode mobile alloc 1-8 binary masks
diff --git a/src/host/gsm48-andreas/sysinfo.h b/src/host/gsm48-andreas/sysinfo.h
index 8ff84c4d..110433ae 100644
--- a/src/host/gsm48-andreas/sysinfo.h
+++ b/src/host/gsm48-andreas/sysinfo.h
@@ -22,8 +22,16 @@
/* 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)
+#define FREQ_TYPE_SERV 0x01 /* frequency of the serving cell */
+#define FREQ_TYPE_RESERVED 0x02 /* reserved for channel hopping */
+#define FREQ_TYPE_NCELL 0x1c /* frequency of the neighbor cell */
+#define FREQ_TYPE_NCELL_2 0x04 /* sub channel of SI 2 */
+#define FREQ_TYPE_NCELL_2bis 0x08 /* sub channel of SI 2bis */
+#define FREQ_TYPE_NCELL_2ter 0x10 /* sub channel of SI 2ter */
+#define FREQ_TYPE_REP 0xe0 /* frequency to be reported */
+#define FREQ_TYPE_REP_5 0x20 /* sub channel of SI 5 */
+#define FREQ_TYPE_REP_5bis 0x40 /* sub channel of SI 5bis */
+#define FREQ_TYPE_REP_5ter 0x80 /* sub channel of SI 5ter */
/* structure of one frequency */
struct gsm_sysinfo_freq {