diff options
-rw-r--r-- | openbsc/include/openbsc/gsm_data.h | 3 | ||||
-rw-r--r-- | openbsc/src/gsm_data.c | 2 | ||||
-rw-r--r-- | openbsc/src/paging.c | 46 | ||||
-rw-r--r-- | openbsc/src/vty_interface.c | 16 |
4 files changed, 67 insertions, 0 deletions
diff --git a/openbsc/include/openbsc/gsm_data.h b/openbsc/include/openbsc/gsm_data.h index 0261394ed..649aff436 100644 --- a/openbsc/include/openbsc/gsm_data.h +++ b/openbsc/include/openbsc/gsm_data.h @@ -407,6 +407,9 @@ struct gsm_bts_paging_state { struct timer_list work_timer; struct timer_list credit_timer; + /* free chans needed */ + int free_chans_need; + /* load */ u_int16_t available_slots; }; diff --git a/openbsc/src/gsm_data.c b/openbsc/src/gsm_data.c index 392f4ea96..99328aba0 100644 --- a/openbsc/src/gsm_data.c +++ b/openbsc/src/gsm_data.c @@ -222,6 +222,8 @@ struct gsm_bts *gsm_bts_alloc(struct gsm_network *net, enum gsm_bts_type type, } bts->c0->ts[0].pchan = GSM_PCHAN_CCCH_SDCCH4; + bts->paging.free_chans_need = -1; + llist_add_tail(&bts->list, &net->bts_list); return bts; diff --git a/openbsc/src/paging.c b/openbsc/src/paging.c index f24c5cfb7..e42674321 100644 --- a/openbsc/src/paging.c +++ b/openbsc/src/paging.c @@ -118,6 +118,45 @@ static void paging_give_credit(void *data) paging_handle_pending_requests(paging_bts); } +static int can_send_pag_req(struct gsm_bts *bts, int rsl_type) +{ + struct pchan_load pl; + int count; + + memset(&pl, 0, sizeof(pl)); + bts_chan_load(&pl, bts); + + switch (rsl_type) { + case RSL_CHANNEED_TCH_F: + LOGP(DPAG, LOGL_ERROR, "Not implemented.\n"); + break; + case RSL_CHANNEED_TCH_ForH: + LOGP(DPAG, LOGL_ERROR, "Not implemented.\n"); + break; + case RSL_CHANNEED_SDCCH: + goto count_sdcch; + break; + case RSL_CHANNEED_ANY: + default: + if (bts->network->pag_any_tch) + LOGP(DPAG, LOGL_ERROR, "Not implemented.\n"); + else + goto count_sdcch; + break; + } + + return 0; + + /* could available SDCCH */ +count_sdcch: + count = 0; + count += pl.pchan[GSM_PCHAN_SDCCH8_SACCH8C].total + - pl.pchan[GSM_PCHAN_SDCCH8_SACCH8C].used; + count += pl.pchan[GSM_PCHAN_CCCH_SDCCH4].total + - pl.pchan[GSM_PCHAN_CCCH_SDCCH4].used; + return bts->paging.free_chans_need > count; +} + /* * This is kicked by the periodic PAGING LOAD Indicator * coming from abis_rsl.c @@ -154,6 +193,12 @@ static void paging_handle_pending_requests(struct gsm_bts_paging_state *paging_b request = llist_entry(paging_bts->pending_requests.next, struct gsm_paging_request, entry); + /* we need to determine the number of free channels */ + if (paging_bts->free_chans_need != -1) { + if (can_send_pag_req(request->bts, request->chan_type) != 0) + goto skip_paging; + } + /* handle the paging request now */ page_ms(request); paging_bts->available_slots--; @@ -162,6 +207,7 @@ static void paging_handle_pending_requests(struct gsm_bts_paging_state *paging_b llist_del(&request->entry); llist_add_tail(&request->entry, &paging_bts->pending_requests); +skip_paging: bsc_schedule_timer(&paging_bts->work_timer, PAGING_TIMER); } diff --git a/openbsc/src/vty_interface.c b/openbsc/src/vty_interface.c index aba7bccd9..201c30e48 100644 --- a/openbsc/src/vty_interface.c +++ b/openbsc/src/vty_interface.c @@ -360,6 +360,11 @@ static void config_write_bts_single(struct vty *vty, struct gsm_bts *bts) config_write_e1_link(vty, &bts->oml_e1_link, " oml "); vty_out(vty, " oml e1 tei %u%s", bts->oml_tei, VTY_NEWLINE); } + + /* if we have a limit, write it */ + if (bts->paging.free_chans_need >= 0) + vty_out(vty, " paging free %d%s", bts->paging.free_chans_need, VTY_NEWLINE); + vty_out(vty, " gprs mode %s%s", bts_gprs_mode_name(bts->gprs.mode), VTY_NEWLINE); if (bts->gprs.mode != BTS_GPRS_NONE) { @@ -1757,6 +1762,16 @@ DEFUN(cfg_bts_gprs_nsvc_rip, cfg_bts_gprs_nsvc_rip_cmd, return CMD_SUCCESS; } +DEFUN(cfg_bts_pag_free, cfg_bts_pag_free_cmd, + "paging free FREE_NR", + "Only page when having a certain amount of free slots. -1 to disable") +{ + struct gsm_bts *bts = vty->index; + + bts->paging.free_chans_need = atoi(argv[0]); + return CMD_SUCCESS; +} + DEFUN(cfg_bts_gprs_rac, cfg_bts_gprs_rac_cmd, "gprs routing area <0-255>", "GPRS Routing Area Code") @@ -2058,6 +2073,7 @@ int bsc_vty_init(struct gsm_network *net) install_element(BTS_NODE, &cfg_bts_gprs_nsvc_lport_cmd); install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rport_cmd); install_element(BTS_NODE, &cfg_bts_gprs_nsvc_rip_cmd); + install_element(BTS_NODE, &cfg_bts_pag_free_cmd); install_element(BTS_NODE, &cfg_trx_cmd); install_node(&trx_node, dummy_config_write); |