layer23: Pre-rework of the Makefile.am
[osmocom-bb.git] / src / host / layer23 / src / support.c
index 1fb5223..8b8b183 100644 (file)
 
 void gsm_support_init(struct osmocom_ms *ms)
 {
-       struct gsm_support *s = &ms->support;
+       struct gsm_support *sup = &ms->support;
        int i;
 
-       memset(s, 0, sizeof(*s));
+       memset(sup, 0, sizeof(*sup));
+       sup->ms = ms;
 
        /* rf power capability */
-       s->pwr_lev_900 = 3; /* CLASS 4: Handheld 2W */
-       s->pwr_lev_1800 = 0; /* CLASS 1: Handheld 1W */
+       sup->pwr_lev_900 = 3; /* CLASS 4: Handheld 2W */
+       sup->pwr_lev_1800 = 0; /* CLASS 1: Handheld 1W */
        /* controlled early classmark sending */
-       s->es_ind = 0; /* no */
+       sup->es_ind = 0; /* no */
        /* revision level */
-       s->rev_lev = 1; /* phase 2 mobile station */
+       sup->rev_lev = 1; /* phase 2 mobile station */
        /* support of VGCS */
-       s->vgcs = 0; /* no */
+       sup->vgcs = 0; /* no */
        /* support of VBS */
-       s->vbs = 0; /* no */
+       sup->vbs = 0; /* no */
        /* support of SMS */
-       s->sms_ptp = 1; /* yes */
+       sup->sms_ptp = 1; /* yes */
        /* screening indicator */
-       s->ss_ind = 1; /* phase 2 error handling */
+       sup->ss_ind = 1; /* phase 2 error handling */
        /* pseudo synchronised capability */
-       s->ps_cap = 0; /* no */
+       sup->ps_cap = 0; /* no */
        /* CM service prompt */
-       s->cmsp = 0; /* no */
+       sup->cmsp = 0; /* no */
        /* solsa support */
-       s->solsa = 0; /* no */
+       sup->solsa = 0; /* no */
        /* location service support */
-       s->lcsva = 0; /* no */
-       s->loc_serv = 0; /* no */
+       sup->lcsva = 0; /* no */
+       sup->loc_serv = 0; /* no */
        /* codec supprot */
-       s->a5_1 = 0; /* currently not */
-       s->a5_2 = 0;
-       s->a5_3 = 0;
-       s->a5_4 = 0;
-       s->a5_5 = 0;
-       s->a5_6 = 0;
-       s->a5_7 = 0;
+       sup->a5_1 = 0; /* currently not */
+       sup->a5_2 = 0;
+       sup->a5_3 = 0;
+       sup->a5_4 = 0;
+       sup->a5_5 = 0;
+       sup->a5_6 = 0;
+       sup->a5_7 = 0;
        /* radio support */
-       s->p_gsm = 1; /* gsm 900 */
-       s->e_gsm = 0;
-       s->r_gsm = 0;
-       s->r_capa = 0;
-       s->low_capa = 4; /* p,e,r power class */
-       s->dcs_1800 = 1;
+       sup->p_gsm = 1; /* P-GSM */
+       sup->e_gsm = 1; /* E-GSM */
+       sup->r_gsm = 1; /* R-GSM */
+       sup->r_capa = 0;
+       sup->low_capa = 4; /* p,e,r power class */
+       sup->dcs_1800 = 1;
        /* set supported frequencies */
-       if (s->e_gsm || s->r_gsm)
-               s->freq_map[0] |= 1;
-       if (s->p_gsm || s->e_gsm || s->r_gsm)
+       if (sup->p_gsm)
                for(i = 1; i <= 124; i++)
-                       s->freq_map[i >> 3] |= (1 << (i & 7));
-       if (s->dcs_1800)
+                       sup->freq_map[i >> 3] |= (1 << (i & 7));
+       if (sup->dcs_1800)
                for(i = 512; i <= 885; i++)
-                       s->freq_map[i >> 3] |= (1 << (i & 7));
-       if (s->e_gsm)
+                       sup->freq_map[i >> 3] |= (1 << (i & 7));
+       if (sup->e_gsm) {
                for(i = 975; i <= 1023; i++)
-                       s->freq_map[i >> 3] |= (1 << (i & 7));
-       if (s->r_gsm)
-               for(i = 955; i <= 1023; i++)
-                       s->freq_map[i >> 3] |= (1 << (i & 7));
-       s->dcs_capa = 1; /* dcs power class */
+                       sup->freq_map[i >> 3] |= (1 << (i & 7));
+               sup->freq_map[0] |= 1;
+       }
+       if (sup->r_gsm)
+               for(i = 955; i <= 974; i++)
+                       sup->freq_map[i >> 3] |= (1 << (i & 7));
+       sup->dcs_capa = 1; /* dcs power class */
        /* multi slot support */
-       s->ms_sup = 0; /* no */
+       sup->ms_sup = 0; /* no */
        /* ucs2 treatment */
-       s->ucs2_treat = 0; /* default */
+       sup->ucs2_treat = 0; /* default */
        /* support extended measurements */
-       s->ext_meas = 0; /* no */
+       sup->ext_meas = 0; /* no */
        /* support switched measurement capability */
-       s->meas_cap = 0; /* no */
-       //s->sms_val = ;
-       //s->sm_val = ;
+       sup->meas_cap = 0; /* no */
+       //sup->sms_val = ;
+       //sup->sm_val = ;
 
-       /* IMEI */
-       sprintf(s->imei, "000000000000000");
-       sprintf(s->imeisv, "0000000000000000");
+       /* radio */
+       sup->min_rxlev_db = -100; // TODO
+       sup->sync_to = 6; /* how long to wait sync (0.9 s) */
+       sup->scan_to = 4; /* how long to wait for all sysinfos (>=4 s) */
 }
 
+/* (3.2.1) maximum channels to scan within each band */
+struct gsm_support_scan_max gsm_sup_smax[] = {
+       { 259, 293, 15, 0 }, /* GSM 450 */
+       { 306, 340, 15, 0 }, /* GSM 480 */
+       { 438, 511, 25, 0 },
+       { 128, 251, 30, 0 }, 
+       { 955, 124, 30, 0 }, /* P,E,R GSM */
+       { 512, 885, 40, 0 }, /* DCS 1800 */
+       { 0, 0, 0, 0 }
+};
+
+/* dump support */
+void gsm_support_dump(struct gsm_support *sup,
+                       void (*print)(void *, const char *, ...), void *priv)
+{
+       print(priv, "Supported features of MS '%s':\n", sup->ms->name);
+       if (sup->r_gsm)
+               print(priv, " R-GSM (Channels 955-974)\n");
+       if (sup->e_gsm)
+               print(priv, " E-GSM (Channels 975-1023,0)\n");
+       if (sup->p_gsm)
+               print(priv, " P-GSM (Channels 1-124)\n");
+       if (sup->dcs_1800)
+               print(priv, " DCS1800 (Channels 512-885)\n");
+       print(priv, " Phase %d mobile station\n", sup->rev_lev + 1);
+       print(priv, " CECS     : %s\n", (sup->es_ind) ? "yes" : "no");
+       print(priv, " VGCS     : %s\n", (sup->vgcs) ? "yes" : "no");
+       print(priv, " VBS      : %s\n", (sup->vbs) ? "yes" : "no");
+       print(priv, " SMS      : %s\n", (sup->sms_ptp) ? "yes" : "no");
+       print(priv, " SS_IND   : %s\n", (sup->ss_ind) ? "yes" : "no");
+       print(priv, " PS_CAP   : %s\n", (sup->ps_cap) ? "yes" : "no");
+       print(priv, " CMSP     : %s\n", (sup->cmsp) ? "yes" : "no");
+       print(priv, " SoLSA    : %s\n", (sup->solsa) ? "yes" : "no");
+       print(priv, " LCSVA    : %s\n", (sup->lcsva) ? "yes" : "no");
+       print(priv, " LOC_SERV : %s\n", (sup->loc_serv) ? "yes" : "no");
+       print(priv, " A5/1     : %s\n", (sup->a5_1) ? "yes" : "no");
+       print(priv, " A5/2     : %s\n", (sup->a5_2) ? "yes" : "no");
+       print(priv, " A5/3     : %s\n", (sup->a5_3) ? "yes" : "no");
+       print(priv, " A5/4     : %s\n", (sup->a5_4) ? "yes" : "no");
+       print(priv, " A5/5     : %s\n", (sup->a5_5) ? "yes" : "no");
+       print(priv, " A5/6     : %s\n", (sup->a5_6) ? "yes" : "no");
+       print(priv, " A5/7     : %s\n", (sup->a5_7) ? "yes" : "no");
+       print(priv, " A5/1     : %s\n", (sup->a5_1) ? "yes" : "no");
+       print(priv, " Min RXLEV: %d\n", sup->min_rxlev_db);
+}