summaryrefslogtreecommitdiffstats
path: root/bootstrap.c
diff options
context:
space:
mode:
Diffstat (limited to 'bootstrap.c')
-rw-r--r--bootstrap.c128
1 files changed, 90 insertions, 38 deletions
diff --git a/bootstrap.c b/bootstrap.c
index 96f7ec2..b2d2b0c 100644
--- a/bootstrap.c
+++ b/bootstrap.c
@@ -636,7 +636,7 @@ static u_int8_t si1[] = {
/* s1 reset*/0x2B
};
-static u_int8_t *gsm48_si1(u_int8_t *arfcn_list, int arfcn_len, int max_trans, int tx_integer, int cell_barr, int re, int ec, u_int8_t *ac_list, int ac_len)
+static u_int8_t *gsm48_si1(struct gsm_bts_conf *conf)
{
static u_int8_t si[23];
int i, bit, octet;
@@ -647,24 +647,24 @@ static u_int8_t *gsm48_si1(u_int8_t *arfcn_list, int arfcn_len, int max_trans, i
si[0] = 0x55;
si[1] = 0x06;
si[2] = 0x19;
- /* ccdesc */
- for (i = 0; i < arfcn_len; i++) {
- if (arfcn_list[i] <= 124 && arfcn_list[i] > 0) {
- bit = (arfcn_list[i] - 1) & 7;
- octet = (arfcn_list[i] -1) / 8;
+ /* ccdesc 10.5.2.1b.2 (bit map 0 format) */
+ for (i = 0; i < conf->arfcn_len; i++) {
+ if (conf->arfcn_list[i] <= 124 && conf->arfcn_list[i] > 0) {
+ bit = (conf->arfcn_list[i] - 1) & 7;
+ octet = (conf->arfcn_list[i] -1) / 8;
si[18 - octet] |= (1 << bit);
}
}
- /* rach */
- si[19] = (max_trans << 6);
- si[19] |= (tx_integer << 2);
- si[19] |= (cell_barr << 1);
- si[19] |= re;
- si[20] = (ec << 2);
- for (i = 0; i < ac_len; i++) {
- if (ac_list[i] <= 15 && ac_list[i] != 10) {
- bit = ac_list[i] & 7;
- octet = ac_list[i] / 8;
+ /* rach 10.5.2.29 */
+ si[19] = (conf->max_trans << 6);
+ si[19] |= (conf->tx_integer << 2);
+ si[19] |= (conf->cell_barr << 1);
+ si[19] |= conf->re;
+ si[20] = (conf->ec << 2);
+ for (i = 0; i < conf->ac_len; i++) {
+ if (conf->ac_list[i] <= 15 && conf->ac_list[i] != 10) {
+ bit = conf->ac_list[i] & 7;
+ octet = conf->ac_list[i] / 8;
si[21 - octet] |= (1 << bit);
}
}
@@ -701,7 +701,7 @@ static u_int8_t si2[] = {
/* rach*/0xD5, 0x00, 0x00
};
-static u_int8_t *gsm48_si2(int ba, u_int8_t *arfcn_list, int arfcn_len, u_int8_t ncc, int max_trans, int tx_integer, int cell_barr, int re, int ec, u_int8_t *ac_list, int ac_len)
+static u_int8_t *gsm48_si2(struct gsm_bts_conf *conf)
{
static u_int8_t si[23];
int i, bit, octet;
@@ -712,27 +712,27 @@ static u_int8_t *gsm48_si2(int ba, u_int8_t *arfcn_list, int arfcn_len, u_int8_t
si[0] = 0x59;
si[1] = 0x06;
si[2] = 0x1A;
- /* ncdesc */
- si[3] = (ba << 4);
- for (i = 0; i < arfcn_len; i++) {
- if (arfcn_list[i] <= 124 && arfcn_list[i] > 0) {
- bit = (arfcn_list[i] - 1) & 7;
- octet = (arfcn_list[i] -1) / 8;
+ /* ncdesc 10.5.2.22 */
+ si[3] = (ba_ind << 4);
+ for (i = 0; i < conf->ncell_arfcn_len; i++) {
+ if (conf->ncell_arfcn_list[i] <= 124 && conf->ncell_arfcn_list[i] > 0) {
+ bit = (conf->ncell_arfcn_list[i] - 1) & 7;
+ octet = (conf->ncell_arfcn_list[i] -1) / 8;
si[18 - octet] |= (1 << bit);
}
}
- /* ncc */
- si[19] = ncc;
- /* rach */
- si[20] = (max_trans << 6);
- si[20] |= (tx_integer << 2);
- si[20] |= (cell_barr << 1);
- si[20] |= re;
- si[21] = (ec << 2);
- for (i = 0; i < ac_len; i++) {
- if (ac_list[i] <= 15 && ac_list[i] != 10) {
- bit = ac_list[i] & 7;
- octet = ac_list[i] / 8;
+ /* ncc 10.5.2.27 */
+ si[19] = conf->ncc;
+ /* rach 10.5.2.29 */
+ si[20] = (conf->max_trans << 6);
+ si[20] |= (conf->tx_integer << 2);
+ si[20] |= (conf->cell_barr << 1);
+ si[20] |= conf->re;
+ si[21] = (conf->ec << 2);
+ for (i = 0; i < conf->ac_len; i++) {
+ if (conf->ac_list[i] <= 15 && conf->ac_list[i] != 10) {
+ bit = conf->ac_list[i] & 7;
+ octet = data->ac_list[i] / 8;
si[22 - octet] |= (1 << bit);
}
}
@@ -784,6 +784,7 @@ SYSTEM INFORMATION TYPE 3
Scheduling Information is not sent in SYSTEM INFORMATION TYPE 9 on the BCCH
*/
static u_int8_t si3[] = {
+#warning nicht 0x59 == 22 octets + length
/* header */0x49, 0x06, 0x1B,
/* cell */0x00, 0x01,
/* lai */0x00, 0xF1, 0x10, 0x00, 0x01,
@@ -791,9 +792,60 @@ static u_int8_t si3[] = {
/* option*/0x28,
/* selection*/0x62, 0x00,
/* rach */0xD5, 0x00, 0x00,
- /* reset*/0x80, 0x00, 0x00, 0x2B
+ /* rest */0x80, 0x00, 0x00, 0x2B
};
+static u_int8_t *gsm48_si3(struct gsm_net *net, struct gsm_bts_conf *conf)
+{
+ static u_int8_t si[23];
+ int i, bit, octet;
+
+ memset(&si, 0, sizeof(si));
+
+ /* header */
+#warning testing
+ si[0] = 0x59;
+ si[1] = 0x06;
+ si[2] = 0x1B;
+ /* cell 10.5.1.1 */
+ si[3] = ci >> 8;
+ si[4] = ci;
+ /* lai 10.5.1.3 */
+ gsm0408_generate_lai(&si[5], network->country_code,
+ network->network_code,
+ conf->location_area_code);
+ /* desc 10.5.2.11 */
+ si[10] = conf->att << 6;
+ si[10] |= conf->bs_ag_blks_res << 3;
+ si[10] |= conf->ccch_conf;
+ si[11] = conf->bs_pa_mfrms;
+ si[12] = conf->t3212_decihours;
+ /* option 10.5.2.3 */
+ si[13] = conf->pwrc << 6;
+ si[13] |= conf->dtx << 4;
+ si[13] |= conf->rl_timeout;
+ /* selection 10.5.2.4 */
+ si[14] = conf->csel_hyst << 5;
+ si[14] |= conf->ms_txpwr_max_cch;
+ si[15] = conf->acs << 7;
+ si[15] |= conf->neci << 6;
+ si[15] |= conf->rxlev_access_min;
+ /* rach 10.5.2.29 */
+ si[16] = (conf->max_trans << 6);
+ si[16] |= (conf->tx_integer << 2);
+ si[16] |= (conf->cell_barr << 1);
+ si[16] |= conf->re;
+ si[17] = (conf->ec << 2);
+ for (i = 0; i < conf->ac_len; i++) {
+ if (conf->ac_list[i] <= 15 && conf->ac_list[i] != 10) {
+ bit = conf->ac_list[i] & 7;
+ octet = data->ac_list[i] / 8;
+ si[18 - octet] |= (1 << bit);
+ }
+ }
+ /* rest 10.5.2.34 */
+}
+
/*
SYSTEM INFORMATION TYPE 4
Location area identification
@@ -868,8 +920,8 @@ static u_int8_t *gsm48_si5(int ba, u_int8_t *arfcn_list, int arfcn_len)
}
/* testig */
- if (memcmp(&si3, &si, sizeof(si)))
- printf("SI3 does not match default template.\n");
+ if (memcmp(&si5, &si, sizeof(si)))
+ printf("SI5 does not match default template.\n");
return si;
}