diff options
author | Andreas Eversberg <jolly@eversberg.eu> | 2012-07-06 07:40:08 +0200 |
---|---|---|
committer | Andreas Eversberg <jolly@eversberg.eu> | 2012-07-06 07:40:08 +0200 |
commit | b3c6f6c716d4495b0f664b4d0da1a4708fb1d0f2 (patch) | |
tree | d44abf4a6b1553cc5744e6163c27ff95a1275937 | |
parent | d679009a2dbe88869d699060bac40139d79cbd23 (diff) |
Receive cell informations via PCU socket interface
These informations provide RAI, timers, counters and other attributes to
the BSSGP and RLC/MAC processes.
The attributes are stored in gprs_rlcmac_bts global structure.
-rw-r--r-- | src/gprs_rlcmac.h | 15 | ||||
-rw-r--r-- | src/gprs_rlcmac_data.cpp | 10 | ||||
-rw-r--r-- | src/pcu_main.cpp | 2 | ||||
-rw-r--r-- | src/sysmo_l1_if.cpp | 76 |
4 files changed, 87 insertions, 16 deletions
diff --git a/src/gprs_rlcmac.h b/src/gprs_rlcmac.h index 8c69ed7c..686b70ec 100644 --- a/src/gprs_rlcmac.h +++ b/src/gprs_rlcmac.h @@ -56,8 +56,19 @@ struct gprs_rlcmac_trx { }; struct gprs_rlcmac_bts { - uint8_t cs; /* block length 1=CS-1, 2=CS-2, 3=CS-3, 4=CS-4 */ - uint16_t t3192_msec; + uint8_t cs1; + uint8_t cs2; + uint8_t cs3; + uint8_t cs4; + uint8_t initial_cs; + uint8_t t3142; + uint8_t t3169; + uint8_t t3191; + uint16_t t3193_msec; + uint8_t t3195; + uint8_t n3101; + uint8_t n3103; + uint8_t n3105; struct gprs_rlcmac_trx trx[8]; }; diff --git a/src/gprs_rlcmac_data.cpp b/src/gprs_rlcmac_data.cpp index 018ef3ee..c88ca043 100644 --- a/src/gprs_rlcmac_data.cpp +++ b/src/gprs_rlcmac_data.cpp @@ -925,7 +925,7 @@ do_resend: /* now we still have untransmitted LLC data, so we fill mac block */ index = tbf->dir.dl.v_s & mod_sns_half; data = tbf->rlc_block[index]; - switch (bts->cs) { + switch (bts->initial_cs) { case 2: /* CS-2 */ block_length = 34; block_data = 33; @@ -1218,12 +1218,8 @@ int gprs_rlcmac_downlink_ack(struct gprs_rlcmac_tbf *tbf, uint8_t final, /* no message, start T3193, change state to RELEASE */ LOGP(DRLCMACDL, LOGL_DEBUG, "- No new message, so we " "release.\n"); - /* use T3192 for T3193 */ - if (bts->t3192_msec) - tbf_timer_start(tbf, 3193, bts->t3192_msec / 1000, - bts->t3192_msec & 1000); - else - tbf_timer_start(tbf, 3193, T3193); /* max T3192 */ + /* start T3193 */ + tbf_timer_start(tbf, 3193, T3193); tbf_new_state(tbf, GPRS_RLCMAC_WAIT_RELEASE); return 0; diff --git a/src/pcu_main.cpp b/src/pcu_main.cpp index 08c75cc5..ae176bc0 100644 --- a/src/pcu_main.cpp +++ b/src/pcu_main.cpp @@ -58,7 +58,7 @@ int main(int argc, char *argv[]) gprs_rlcmac_bts = talloc_zero(NULL, struct gprs_rlcmac_bts); if (!gprs_rlcmac_bts) return -ENOMEM; - gprs_rlcmac_bts->cs = 1; + gprs_rlcmac_bts->initial_cs = 1; osmo_init_logging(&gprs_log_info); pcu_l1if_open(); diff --git a/src/sysmo_l1_if.cpp b/src/sysmo_l1_if.cpp index 106d40bf..89d7ab8c 100644 --- a/src/sysmo_l1_if.cpp +++ b/src/sysmo_l1_if.cpp @@ -34,6 +34,7 @@ extern "C" { #include <gprs_rlcmac.h> #include <pcu_l1_if.h> #include <gprs_debug.h> +#include <gprs_bssgp_pcu.h> #include "../../osmo-bts/include/osmo-bts/pcuif_proto.h" static int pcu_sock_send(struct msgb *msg); @@ -236,12 +237,13 @@ static int pcu_rx_info_ind(struct gsm_pcu_if_info_ind *info_ind) int rc = 0; int trx, ts, tfi; struct gprs_rlcmac_tbf *tbf; -// uint8_t si13[23]; + int i; LOGP(DL1IF, LOGL_INFO, "Info indication received:\n"); if (!(info_ind->flags & PCU_IF_FLAG_ACTIVE)) { LOGP(DL1IF, LOGL_NOTICE, "BTS not available\n"); +bssgp_failed: /* free all TBF */ for (trx = 0; trx < 8; trx++) { bts->trx[trx].arfcn = info_ind->trx[trx].arfcn; @@ -256,6 +258,73 @@ static int pcu_rx_info_ind(struct gsm_pcu_if_info_ind *info_ind) return 0; } LOGP(DL1IF, LOGL_INFO, "BTS available\n"); + LOGP(DL1IF, LOGL_INFO, " mcc=%d\n", info_ind->mcc); + LOGP(DL1IF, LOGL_INFO, " mnc=%d\n", info_ind->mnc); + LOGP(DL1IF, LOGL_INFO, " lac=%d\n", info_ind->lac); + LOGP(DL1IF, LOGL_INFO, " rac=%d\n", info_ind->rac); + LOGP(DL1IF, LOGL_INFO, " cell_id=%d\n", info_ind->cell_id); + LOGP(DL1IF, LOGL_INFO, " nsei=%d\n", info_ind->nsei); + LOGP(DL1IF, LOGL_INFO, " nse_timer=%d %d %d %d %d %d %d\n", + info_ind->nse_timer[0], info_ind->nse_timer[1], + info_ind->nse_timer[2], info_ind->nse_timer[3], + info_ind->nse_timer[4], info_ind->nse_timer[5], + info_ind->nse_timer[6]); + LOGP(DL1IF, LOGL_INFO, " cell_timer=%d %d %d %d %d %d %d %d %d %d %d\n", + info_ind->cell_timer[0], info_ind->cell_timer[1], + info_ind->cell_timer[2], info_ind->cell_timer[3], + info_ind->cell_timer[4], info_ind->cell_timer[5], + info_ind->cell_timer[6], info_ind->cell_timer[7], + info_ind->cell_timer[8], info_ind->cell_timer[9], + info_ind->cell_timer[10]); + LOGP(DL1IF, LOGL_INFO, " repeat_time=%d\n", info_ind->repeat_time); + LOGP(DL1IF, LOGL_INFO, " repeat_count=%d\n", info_ind->repeat_count); + LOGP(DL1IF, LOGL_INFO, " bvci=%d\n", info_ind->bvci); + LOGP(DL1IF, LOGL_INFO, " t3142=%d\n", info_ind->t3142); + LOGP(DL1IF, LOGL_INFO, " t3169=%d\n", info_ind->t3169); + LOGP(DL1IF, LOGL_INFO, " t3191=%d\n", info_ind->t3191); + LOGP(DL1IF, LOGL_INFO, " t3193=%d (ms)\n", info_ind->t3193_10ms * 10); + LOGP(DL1IF, LOGL_INFO, " t3195=%d\n", info_ind->t3195); + LOGP(DL1IF, LOGL_INFO, " n3101=%d\n", info_ind->n3101); + LOGP(DL1IF, LOGL_INFO, " n3103=%d\n", info_ind->n3103); + LOGP(DL1IF, LOGL_INFO, " n3105=%d\n", info_ind->n3105); + LOGP(DL1IF, LOGL_INFO, " cv_countdown=%d\n", info_ind->cv_countdown); + LOGP(DL1IF, LOGL_INFO, " dl_tbf_ext=%d\n", info_ind->dl_tbf_ext); + LOGP(DL1IF, LOGL_INFO, " ul_tbf_ext=%d\n", info_ind->ul_tbf_ext); + for (i = 0; i < 4; i++) { + if ((info_ind->flags & (PCU_IF_FLAG_CS1 << i))) + LOGP(DL1IF, LOGL_INFO, " Use CS%d\n", i+1); + } + for (i = 0; i < 9; i++) { + if ((info_ind->flags & (PCU_IF_FLAG_MCS1 << i))) + LOGP(DL1IF, LOGL_INFO, " Use MCS%d\n", i+1); + } + LOGP(DL1IF, LOGL_INFO, " initial_cs=%d\n", info_ind->initial_cs); + LOGP(DL1IF, LOGL_INFO, " initial_mcs=%d\n", info_ind->initial_mcs); + LOGP(DL1IF, LOGL_INFO, " nsvci=%d\n", info_ind->nsvci[0]); + LOGP(DL1IF, LOGL_INFO, " local_port=%d\n", info_ind->local_port[0]); + LOGP(DL1IF, LOGL_INFO, " remote_port=%d\n", info_ind->remote_port[0]); + LOGP(DL1IF, LOGL_INFO, " remote_ip=%d\n", info_ind->remote_ip[0]); + + bts->cs1 = !!(info_ind->flags & PCU_IF_FLAG_CS1); + bts->cs2 = !!(info_ind->flags & PCU_IF_FLAG_CS2); + bts->cs3 = !!(info_ind->flags & PCU_IF_FLAG_CS3); + bts->cs4 = !!(info_ind->flags & PCU_IF_FLAG_CS4); + if (!bts->cs1 && !bts->cs2 && !bts->cs3 && !bts->cs4) + bts->cs1 = 1; + if (info_ind->t3142) { /* if timer values are set */ + bts->t3142 = info_ind->t3142; + bts->t3169 = info_ind->t3169; + bts->t3191 = info_ind->t3191; + bts->t3193_msec = info_ind->t3193_10ms * 10; + bts->t3195 = info_ind->t3195; + bts->n3101 = info_ind->n3101; + bts->n3103 = info_ind->n3103; + bts->n3105 = info_ind->n3105; + } + if (info_ind->initial_cs < 1 || info_ind->initial_cs > 4) + bts->initial_cs = 1; + else + bts->initial_cs = info_ind->initial_cs; for (trx = 0; trx < 8; trx++) { bts->trx[trx].arfcn = info_ind->trx[trx].arfcn; @@ -283,11 +352,6 @@ static int pcu_rx_info_ind(struct gsm_pcu_if_info_ind *info_ind) } } -#warning FIXME: RAC -// rc = generate_si13(si13, 0 /* rac */); -// printf("rc=%d\n", rc); -// pcu_l1if_tx_bcch(si13, 23); - return rc; } |