diff options
Diffstat (limited to 'src/pcu_vty.c')
-rw-r--r-- | src/pcu_vty.c | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/src/pcu_vty.c b/src/pcu_vty.c index 3b5996c8..fc57a5f4 100644 --- a/src/pcu_vty.c +++ b/src/pcu_vty.c @@ -16,6 +16,70 @@ #include "pcu_vty_functions.h" +extern void *tall_pcu_ctx; + +static const struct value_string pcu_gsmtap_categ_names[] = { + { PCU_GSMTAP_C_DL_UNKNOWN, "dl-unknown" }, + { PCU_GSMTAP_C_DL_DUMMY, "dl-dummy" }, + { PCU_GSMTAP_C_DL_CTRL, "dl-ctrl" }, + { PCU_GSMTAP_C_DL_DATA_GPRS, "dl-data-gprs" }, + { PCU_GSMTAP_C_DL_DATA_EGPRS, "dl-data-egprs" }, + + { PCU_GSMTAP_C_UL_UNKNOWN, "ul-unknown" }, + { PCU_GSMTAP_C_UL_DUMMY, "ul-dummy" }, + { PCU_GSMTAP_C_UL_CTRL, "ul-ctrl" }, + { PCU_GSMTAP_C_UL_DATA_GPRS, "ul-data-gprs" }, + { PCU_GSMTAP_C_UL_DATA_EGPRS, "ul-data-egprs" }, + + { 0, NULL } +}; + +static const struct value_string pcu_gsmtap_categ_help[] = { + { PCU_GSMTAP_C_DL_UNKNOWN, "Unknown / Unparseable / Erroneous Downlink Blocks" }, + { PCU_GSMTAP_C_DL_DUMMY, "Downlink Dummy Blocks" }, + { PCU_GSMTAP_C_DL_CTRL, "Downlink Control Blocks" }, + { PCU_GSMTAP_C_DL_DATA_GPRS, "Downlink Data Blocks (GPRS)" }, + { PCU_GSMTAP_C_DL_DATA_EGPRS, "Downlink Data Blocks (EGPRS)" }, + + { PCU_GSMTAP_C_UL_UNKNOWN, "Unknown / Unparseable / Erroneous Downlink Blocks" }, + { PCU_GSMTAP_C_UL_DUMMY, "Uplink Dummy Blocks" }, + { PCU_GSMTAP_C_UL_CTRL, "Uplink Control Blocks" }, + { PCU_GSMTAP_C_UL_DATA_GPRS, "Uplink Data Blocks (GPRS)" }, + { PCU_GSMTAP_C_UL_DATA_EGPRS, "Uplink Data Blocks (EGPRS)" }, + + { 0, NULL } +}; + + +DEFUN(cfg_pcu_gsmtap_categ, cfg_pcu_gsmtap_categ_cmd, "HIDDEN", "HIDDEN") +{ + struct gprs_rlcmac_bts *bts = bts_main_data(); + int categ; + + categ = get_string_value(pcu_gsmtap_categ_names, argv[0]); + if (categ < 0) + return CMD_WARNING; + + bts->gsmtap_categ_mask |= (1 << categ); + + return CMD_SUCCESS; +} + +DEFUN(cfg_pcu_no_gsmtap_categ, cfg_pcu_no_gsmtap_categ_cmd, "HIDDEN", "HIDDEN") +{ + struct gprs_rlcmac_bts *bts = bts_main_data(); + int categ; + + categ = get_string_value(pcu_gsmtap_categ_names, argv[0]); + if (categ < 0) + return CMD_WARNING; + + bts->gsmtap_categ_mask &= ~(1 << categ); + + return CMD_SUCCESS; +} + + int pcu_vty_go_parent(struct vty *vty) { switch (vty->node) { @@ -53,6 +117,7 @@ static struct cmd_node pcu_node = { static int config_write_pcu(struct vty *vty) { struct gprs_rlcmac_bts *bts = bts_main_data(); + unsigned int i; vty_out(vty, "pcu%s", VTY_NEWLINE); if (bts->egprs_enabled) @@ -167,6 +232,14 @@ static int config_write_pcu(struct vty *vty) vty_out(vty, " dl-tbf-idle-time %d%s", bts->dl_tbf_idle_msec, VTY_NEWLINE); + for (i = 0; i < 32; i++) { + unsigned int cs = (1 << i); + if (bts->gsmtap_categ_mask & cs) { + vty_out(vty, " gsmtap-category %s%s", + get_value_string(pcu_gsmtap_categ_names, i), VTY_NEWLINE); + } + } + return pcu_vty_config_write_pcu_ext(vty); } @@ -953,6 +1026,19 @@ int pcu_vty_init(const struct log_info *cat) { // install_element_ve(&show_pcu_cmd); + cfg_pcu_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names, + "gsmtap-category (", + "|",")", VTY_DO_LOWER); + cfg_pcu_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help, + "GSMTAP Category\n", + "\n", "", 0); + cfg_pcu_no_gsmtap_categ_cmd.string = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_names, + "no gsmtap-category (", + "|",")", VTY_DO_LOWER); + cfg_pcu_no_gsmtap_categ_cmd.doc = vty_cmd_string_from_valstr(tall_pcu_ctx, pcu_gsmtap_categ_help, + NO_STR "GSMTAP Category\n", + "\n", "", 0); + logging_vty_add_cmds(cat); osmo_stats_vty_add_cmds(cat); @@ -1006,6 +1092,8 @@ int pcu_vty_init(const struct log_info *cat) install_element(PCU_NODE, &cfg_pcu_no_dl_tbf_idle_time_cmd); install_element(PCU_NODE, &cfg_pcu_ms_idle_time_cmd); install_element(PCU_NODE, &cfg_pcu_no_ms_idle_time_cmd); + install_element(PCU_NODE, &cfg_pcu_gsmtap_categ_cmd); + install_element(PCU_NODE, &cfg_pcu_no_gsmtap_categ_cmd); install_element_ve(&show_bts_stats_cmd); install_element_ve(&show_tbf_cmd); |