Move llc_* fields from BTS to PCU

Change-Id: Iffb916e53fdf99164ad07cd19e4b35a64136307e
changes/91/22191/4
Pau Espin 2 years ago
parent 519d071131
commit f473ec9d7a
  1. 3
      src/bts.cpp
  2. 4
      src/bts.h
  3. 2
      src/gprs_bssgp_pcu.cpp
  4. 2
      src/gprs_ms.c
  5. 2
      src/gprs_pcu.c
  6. 4
      src/gprs_pcu.h
  7. 4
      src/llc.cpp
  8. 70
      src/pcu_vty.c
  9. 8
      src/tbf_dl.cpp

@ -201,9 +201,6 @@ static void bts_init(struct gprs_rlcmac_bts *bts, BTS* bts_obj)
bts->n3105 = 8;
bts->si13_is_set = false;
bts->llc_codel_interval_msec = LLC_CODEL_USE_DEFAULT;
bts->llc_idle_ack_csec = 10;
bts->app_info = NULL;
bts->bts = bts_obj;
bts->T_defs_bts = T_defs_bts;

@ -89,10 +89,6 @@ struct gprs_rlcmac_bts {
uint16_t mcs_mask; /* Allowed MCS mask from BTS */
uint8_t initial_cs_dl, initial_cs_ul;
uint8_t initial_mcs_dl, initial_mcs_ul;
uint16_t force_llc_lifetime; /* overrides lifetime from SGSN */
uint32_t llc_discard_csec;
uint32_t llc_idle_ack_csec;
uint32_t llc_codel_interval_msec; /* 0=disabled, -1=use default interval */
/* Timer defintions */
struct osmo_tdef *T_defs_bts; /* timers controlled by BTS, received through PCUIF */
uint8_t n3101;

@ -676,7 +676,7 @@ static uint32_t compute_bucket_size(struct gprs_rlcmac_bts *bts,
uint16_t bucket_time = the_pcu->vty.fc_bucket_time;
if (bucket_time == 0)
bucket_time = bts->force_llc_lifetime;
bucket_time = the_pcu->vty.force_llc_lifetime;
if (bucket_time == 0xffff)
bucket_size = FC_MAX_BUCKET_SIZE;

@ -121,7 +121,7 @@ struct GprsMs *ms_alloc(struct BTS *bts, uint32_t tlli)
ms_set_mode(ms, GPRS);
if (ms->bts)
codel_interval = bts_data(ms->bts)->llc_codel_interval_msec;
codel_interval = the_pcu->vty.llc_codel_interval_msec;
if (codel_interval) {
if (codel_interval == LLC_CODEL_USE_DEFAULT)

@ -94,6 +94,8 @@ struct gprs_pcu *gprs_pcu_alloc(void *ctx)
/* TODO: increase them when CRBB decoding is implemented */
pcu->vty.ws_base = 64;
pcu->vty.ws_pdch = 0;
pcu->vty.llc_codel_interval_msec = LLC_CODEL_USE_DEFAULT;
pcu->vty.llc_idle_ack_csec = 10;
pcu->T_defs = T_defs_pcu;
osmo_tdefs_reset(pcu->T_defs);

@ -97,6 +97,10 @@ struct gprs_pcu {
enum gprs_ns2_dialect ns_dialect; /* Are we talking Gb with IP-SNS (true) or classic Gb? */
uint16_t ws_base;
uint16_t ws_pdch; /* increase WS by this value per PDCH */
uint16_t force_llc_lifetime; /* overrides lifetime from SGSN */
uint32_t llc_discard_csec;
uint32_t llc_idle_ack_csec;
uint32_t llc_codel_interval_msec; /* 0=disabled, -1=use default interval */
} vty;
struct gsmtap_inst *gsmtap;

@ -224,8 +224,8 @@ struct msgb *gprs_llc_queue::dequeue(const MetaInfo **info)
void gprs_llc_queue::calc_pdu_lifetime(BTS *bts, const uint16_t pdu_delay_csec, struct timespec *tv)
{
uint16_t delay_csec;
if (bts->bts_data()->force_llc_lifetime)
delay_csec = bts->bts_data()->force_llc_lifetime;
if (bts->pcu->vty.force_llc_lifetime)
delay_csec = bts->pcu->vty.force_llc_lifetime;
else
delay_csec = pdu_delay_csec;

@ -201,24 +201,24 @@ static int config_write_pcu(struct vty *vty)
if (the_pcu->vty.dl_arq_type == EGPRS_ARQ2)
vty_out(vty, " egprs dl arq-type arq2%s", VTY_NEWLINE);
if (bts->force_llc_lifetime == 0xffff)
if (the_pcu->vty.force_llc_lifetime == 0xffff)
vty_out(vty, " queue lifetime infinite%s", VTY_NEWLINE);
else if (bts->force_llc_lifetime)
vty_out(vty, " queue lifetime %d%s", bts->force_llc_lifetime,
else if (the_pcu->vty.force_llc_lifetime)
vty_out(vty, " queue lifetime %d%s", the_pcu->vty.force_llc_lifetime,
VTY_NEWLINE);
if (bts->llc_discard_csec)
vty_out(vty, " queue hysteresis %d%s", bts->llc_discard_csec,
if (the_pcu->vty.llc_discard_csec)
vty_out(vty, " queue hysteresis %d%s", the_pcu->vty.llc_discard_csec,
VTY_NEWLINE);
if (bts->llc_idle_ack_csec)
vty_out(vty, " queue idle-ack-delay %d%s", bts->llc_idle_ack_csec,
if (the_pcu->vty.llc_idle_ack_csec)
vty_out(vty, " queue idle-ack-delay %d%s", the_pcu->vty.llc_idle_ack_csec,
VTY_NEWLINE);
if (bts->llc_codel_interval_msec == LLC_CODEL_USE_DEFAULT)
if (the_pcu->vty.llc_codel_interval_msec == LLC_CODEL_USE_DEFAULT)
vty_out(vty, " queue codel%s", VTY_NEWLINE);
else if (bts->llc_codel_interval_msec == LLC_CODEL_DISABLE)
else if (the_pcu->vty.llc_codel_interval_msec == LLC_CODEL_DISABLE)
vty_out(vty, " no queue codel%s", VTY_NEWLINE);
else
vty_out(vty, " queue codel interval %d%s",
bts->llc_codel_interval_msec/10, VTY_NEWLINE);
the_pcu->vty.llc_codel_interval_msec/10, VTY_NEWLINE);
if (the_pcu->alloc_algorithm == alloc_algorithm_a)
vty_out(vty, " alloc-algorithm a%s", VTY_NEWLINE);
@ -579,11 +579,8 @@ DEFUN_USRATTR(cfg_pcu_queue_lifetime,
"queue lifetime <1-65534>",
QUEUE_STR LIFETIME_STR "Lifetime in centi-seconds")
{
struct gprs_rlcmac_bts *bts = bts_main_data();
uint16_t csec = atoi(argv[0]);
bts->force_llc_lifetime = csec;
the_pcu->vty.force_llc_lifetime = csec;
return CMD_SUCCESS;
}
@ -593,10 +590,7 @@ DEFUN_USRATTR(cfg_pcu_queue_lifetime_inf,
"queue lifetime infinite",
QUEUE_STR LIFETIME_STR "Infinite lifetime")
{
struct gprs_rlcmac_bts *bts = bts_main_data();
bts->force_llc_lifetime = 0xffff;
the_pcu->vty.force_llc_lifetime = 0xffff;
return CMD_SUCCESS;
}
@ -607,10 +601,7 @@ DEFUN_USRATTR(cfg_pcu_no_queue_lifetime,
NO_STR QUEUE_STR "Disable lifetime limit of LLC frame (use value given "
"by SGSN)\n")
{
struct gprs_rlcmac_bts *bts = bts_main_data();
bts->force_llc_lifetime = 0;
the_pcu->vty.force_llc_lifetime = 0;
return CMD_SUCCESS;
}
@ -623,11 +614,8 @@ DEFUN_USRATTR(cfg_pcu_queue_hysteresis,
"queue hysteresis <1-65535>",
QUEUE_STR QUEUE_HYSTERESIS_STR "Hysteresis in centi-seconds")
{
struct gprs_rlcmac_bts *bts = bts_main_data();
uint16_t csec = atoi(argv[0]);
bts->llc_discard_csec = csec;
the_pcu->vty.llc_discard_csec = csec;
return CMD_SUCCESS;
}
@ -637,10 +625,7 @@ DEFUN_USRATTR(cfg_pcu_no_queue_hysteresis,
"no queue hysteresis",
NO_STR QUEUE_STR QUEUE_HYSTERESIS_STR)
{
struct gprs_rlcmac_bts *bts = bts_main_data();
bts->llc_discard_csec = 0;
the_pcu->vty.llc_discard_csec = 0;
return CMD_SUCCESS;
}
@ -651,10 +636,7 @@ DEFUN_USRATTR(cfg_pcu_queue_codel,
"queue codel",
QUEUE_STR QUEUE_CODEL_STR)
{
struct gprs_rlcmac_bts *bts = bts_main_data();
bts->llc_codel_interval_msec = LLC_CODEL_USE_DEFAULT;
the_pcu->vty.llc_codel_interval_msec = LLC_CODEL_USE_DEFAULT;
return CMD_SUCCESS;
}
@ -664,11 +646,8 @@ DEFUN_USRATTR(cfg_pcu_queue_codel_interval,
"queue codel interval <1-1000>",
QUEUE_STR QUEUE_CODEL_STR "Specify interval\n" "Interval in centi-seconds")
{
struct gprs_rlcmac_bts *bts = bts_main_data();
uint16_t csec = atoi(argv[0]);
bts->llc_codel_interval_msec = 10*csec;
the_pcu->vty.llc_codel_interval_msec = 10*csec;
return CMD_SUCCESS;
}
@ -678,10 +657,7 @@ DEFUN_USRATTR(cfg_pcu_no_queue_codel,
"no queue codel",
NO_STR QUEUE_STR QUEUE_CODEL_STR)
{
struct gprs_rlcmac_bts *bts = bts_main_data();
bts->llc_codel_interval_msec = LLC_CODEL_DISABLE;
the_pcu->vty.llc_codel_interval_msec = LLC_CODEL_DISABLE;
return CMD_SUCCESS;
}
@ -694,11 +670,8 @@ DEFUN_ATTR(cfg_pcu_queue_idle_ack_delay,
QUEUE_STR QUEUE_IDLE_ACK_STR "Idle ACK delay in centi-seconds",
CMD_ATTR_IMMEDIATE)
{
struct gprs_rlcmac_bts *bts = bts_main_data();
uint16_t csec = atoi(argv[0]);
bts->llc_idle_ack_csec = csec;
the_pcu->vty.llc_idle_ack_csec = csec;
return CMD_SUCCESS;
}
@ -708,10 +681,7 @@ DEFUN_ATTR(cfg_pcu_no_queue_idle_ack_delay,
NO_STR QUEUE_STR QUEUE_IDLE_ACK_STR,
CMD_ATTR_IMMEDIATE)
{
struct gprs_rlcmac_bts *bts = bts_main_data();
bts->llc_idle_ack_csec = 0;
the_pcu->vty.llc_idle_ack_csec = 0;
return CMD_SUCCESS;
}

@ -202,9 +202,9 @@ void gprs_rlcmac_dl_tbf::cleanup()
void gprs_rlcmac_dl_tbf::start_llc_timer()
{
if (bts_data()->llc_idle_ack_csec > 0) {
if (the_pcu->vty.llc_idle_ack_csec > 0) {
struct timespec tv;
csecs_to_timespec(bts_data()->llc_idle_ack_csec, &tv);
csecs_to_timespec(the_pcu->vty.llc_idle_ack_csec, &tv);
osmo_timer_schedule(&m_llc_timer, tv.tv_sec, tv.tv_nsec / 1000);
}
}
@ -348,8 +348,8 @@ struct msgb *gprs_rlcmac_dl_tbf::llc_dequeue(bssgp_bvc_ctx *bctx)
const unsigned keep_small_thresh = 60;
const MetaInfo *info;
if (bts_data()->llc_discard_csec)
csecs_to_timespec(bts_data()->llc_discard_csec, &hyst_delta);
if (the_pcu->vty.llc_discard_csec)
csecs_to_timespec(the_pcu->vty.llc_discard_csec, &hyst_delta);
osmo_clock_gettime(CLOCK_MONOTONIC, &tv_now);
timespecadd(&tv_now, &hyst_delta, &tv_now2);

Loading…
Cancel
Save