cnpool: make NRI mappings VTY configurable

Implement only the VTY configuration part, applying NRI to select CN
links follows in I66fba27cfbe6e2b27ee3443718846ecfbbd8a974.

Use the osmo_nri_ranges API to manage each cnlink's NRI ranges by VTY
configuration.

Analogous to osmo-bsc
 MSC pooling: make NRI mappings VTY configurable
 4099f1db504c401e3d7211d9761b034d62d15f7c
 I6c251f2744d7be26fc4ad74adefc96a6a3fe08b0
plus
 vty: fix doc: default value for 'nri bitlen'
 f15d236e3eee8e7cbdc184d401f33b062d1b1aac
 I8af840a4589f47eaca6bf10e37e0859f9ae53dfa

Related: SYS#6412
Change-Id: Ifb87e01e5971962e5cfe5e127871af4a67806de1
This commit is contained in:
Neels Hofmeyr 2023-05-18 23:32:59 +02:00
parent a49b265226
commit 9ee468f5b2
7 changed files with 759 additions and 19 deletions

View File

@ -101,9 +101,8 @@ struct hnbgw_sccp_user {
/* User provided configuration for struct hnbgw_cnpool. */
struct hnbgw_cnpool_cfg {
/* FUTURE: This will be added here shortly:
* - global NRI config: bitlen and NULL-NRI.
*/
uint8_t nri_bitlen;
struct osmo_nri_ranges *null_nri_ranges;
};
/* User provided configuration for struct hnbgw_cnlink. */
@ -112,9 +111,7 @@ struct hnbgw_cnlink_cfg {
* use. */
char *remote_addr_name;
/* FUTURE: This will be added here shortly:
* - per peer NRI config: NRI ranges assigned to this peer.
*/
struct osmo_nri_ranges *nri_ranges;
};
/* Collection of CN peers to distribute UE connections across. MSCs for DOMAIN_CS, SGSNs for DOMAIN_PS. */
@ -134,9 +131,10 @@ struct hnbgw_cnpool {
/* List of struct hnbgw_cnlink */
struct llist_head cnlinks;
/* FUTURE: This will be added here shortly:
* - round robin state for new conns
*/
unsigned int round_robin_next_nr;
/* Emergency calls potentially select a different set of MSCs, so to not mess up the normal round-robin
* behavior, emergency calls need a separate round-robin counter. */
unsigned int round_robin_next_emerg_nr;
};
/* A CN peer, like 'msc 0' or 'sgsn 23' */
@ -163,6 +161,9 @@ struct hnbgw_cnlink {
/* linked list of hnbgw_context_map */
struct llist_head map_list;
bool allow_attach;
bool allow_emerg;
};
#define LOG_CNLINK(CNLINK, SUBSYS, LEVEL, FMT, ARGS...) \

View File

@ -24,6 +24,8 @@
#include <osmocom/vty/vty.h>
#include <osmocom/gsm/gsm23236.h>
#include <osmocom/netif/stream.h>
#include "config.h"
@ -67,9 +69,8 @@ void g_hnbgw_alloc(void *ctx)
.peer_name = "msc",
.default_remote_pc = DEFAULT_PC_MSC,
.vty = {
/* FUTURE: This will be added here shortly:
* - defaults for global NRI config: bitlen and NULL-NRI.
*/
.nri_bitlen = OSMO_NRI_BITLEN_DEFAULT,
.null_nri_ranges = osmo_nri_ranges_alloc(g_hnbgw),
},
};
INIT_LLIST_HEAD(&g_hnbgw->sccp.cnpool_iucs.cnlinks);
@ -80,9 +81,8 @@ void g_hnbgw_alloc(void *ctx)
.peer_name = "sgsn",
.default_remote_pc = DEFAULT_PC_SGSN,
.vty = {
/* FUTURE: This will be added here shortly:
* - defaults for global NRI config: bitlen and NULL-NRI.
*/
.nri_bitlen = OSMO_NRI_BITLEN_DEFAULT,
.null_nri_ranges = osmo_nri_ranges_alloc(g_hnbgw),
},
};
INIT_LLIST_HEAD(&g_hnbgw->sccp.cnpool_iups.cnlinks);

View File

@ -27,6 +27,8 @@
#include <osmocom/core/utils.h>
#include <osmocom/core/timer.h>
#include <osmocom/gsm/gsm23236.h>
#include <osmocom/sigtran/protocol/m3ua.h>
#include <osmocom/sigtran/sccp_sap.h>
#include <osmocom/sigtran/sccp_helpers.h>
@ -453,12 +455,26 @@ static int resolve_addr_name(struct osmo_sccp_addr *dest, struct osmo_ss7_instan
void hnbgw_cnpool_apply_cfg(struct hnbgw_cnpool *cnpool)
{
cnpool->use = cnpool->vty;
struct osmo_nri_range *r;
cnpool->use.nri_bitlen = cnpool->vty.nri_bitlen;
osmo_nri_ranges_free(cnpool->use.null_nri_ranges);
cnpool->use.null_nri_ranges = osmo_nri_ranges_alloc(g_hnbgw);
llist_for_each_entry(r, &cnpool->vty.null_nri_ranges->entries, entry)
osmo_nri_ranges_add(cnpool->use.null_nri_ranges, r);
}
static void hnbgw_cnlink_cfg_copy(struct hnbgw_cnlink *cnlink)
{
struct osmo_nri_range *r;
osmo_talloc_replace_string(cnlink, &cnlink->use.remote_addr_name, cnlink->vty.remote_addr_name);
osmo_nri_ranges_free(cnlink->use.nri_ranges);
cnlink->use.nri_ranges = osmo_nri_ranges_alloc(cnlink);
llist_for_each_entry(r, &cnlink->vty.nri_ranges->entries, entry)
osmo_nri_ranges_add(cnlink->use.nri_ranges, r);
}
static bool hnbgw_cnlink_sccp_cfg_changed(struct hnbgw_cnlink *cnlink)
@ -636,7 +652,9 @@ static struct hnbgw_cnlink *cnlink_alloc(struct hnbgw_cnpool *cnpool, int nr)
.nr = nr,
.vty = {
/* VTY config defaults for the new cnlink */
.nri_ranges = osmo_nri_ranges_alloc(cnlink),
},
.allow_attach = true,
};
INIT_LLIST_HEAD(&cnlink->map_list);

View File

@ -26,6 +26,8 @@
#include <osmocom/vty/command.h>
#include <osmocom/vty/tdef_vty.h>
#include <osmocom/gsm/gsm23236.h>
#include <osmocom/hnbgw/vty.h>
#include <osmocom/hnbgw/hnbgw.h>
@ -346,6 +348,69 @@ DEFUN_DEPRECATED(cfg_hnbgw_max_sccp_cr_payload_len, cfg_hnbgw_max_sccp_cr_payloa
return CMD_WARNING;
}
#define NRI_STR "Mapping of Network Resource Indicators to this CN peer, for CN pooling\n"
#define NULL_NRI_STR "Define NULL-NRI values that cause re-assignment of an MS to a different CN peer, for CN pooling.\n"
#define NRI_FIRST_LAST_STR "First value of the NRI value range, should not surpass the configured 'nri bitlen'.\n" \
"Last value of the NRI value range, should not surpass the configured 'nri bitlen' and be larger than the" \
" first value; if omitted, apply only the first value.\n"
#define NRI_ARGS_TO_STR_FMT "%s%s%s"
#define NRI_ARGS_TO_STR_ARGS(ARGC, ARGV) ARGV[0], (ARGC > 1) ? ".." : "", (ARGC > 1) ? ARGV[1] : ""
#define NRI_WARN(CNLINK, FORMAT, args...) do { \
vty_out(vty, "%% Warning: %s %d: " FORMAT "%s", CNLINK->pool->peer_name, CNLINK->nr, ##args, \
VTY_NEWLINE); \
LOGP(DCN, LOGL_ERROR, "%s %d: " FORMAT "\n", CNLINK->pool->peer_name, CNLINK->nr, ##args); \
} while (0)
/* hnbgw/iucs/nri ... AND hnbgw/iups/nri ... */
DEFUN(cfg_hnbgw_cnpool_nri_bitlen,
cfg_hnbgw_cnpool_nri_bitlen_cmd,
"nri bitlen <1-15>",
NRI_STR
"Set number of bits that an NRI has, to extract from TMSI identities (always starting just after the TMSI's most significant octet).\n"
"bit count (default: " OSMO_STRINGIFY_VAL(OSMO_NRI_BITLEN_DEFAULT) ")\n")
{
struct hnbgw_cnpool *cnpool = vty->index;
cnpool->vty.nri_bitlen = atoi(argv[0]);
return CMD_SUCCESS;
}
/* hnbgw/iucs/nri ... AND hnbgw/iups/nri ... */
DEFUN(cfg_hnbgw_cnpool_nri_null_add, cfg_hnbgw_cnpool_nri_null_add_cmd,
"nri null add <0-32767> [<0-32767>]",
NRI_STR NULL_NRI_STR "Add NULL-NRI value (or range)\n"
NRI_FIRST_LAST_STR)
{
int rc;
const char *message;
struct hnbgw_cnpool *cnpool = vty->index;
rc = osmo_nri_ranges_vty_add(&message, NULL, cnpool->vty.null_nri_ranges, argc, argv, cnpool->vty.nri_bitlen);
if (message)
vty_out(vty, "%% %s: " NRI_ARGS_TO_STR_FMT, message, NRI_ARGS_TO_STR_ARGS(argc, argv));
if (rc < 0)
return CMD_WARNING;
return CMD_SUCCESS;
}
/* hnbgw/iucs/nri ... AND hnbgw/iups/nri ... */
DEFUN(cfg_hnbgw_cnpool_nri_null_del, cfg_hnbgw_cnpool_nri_null_del_cmd,
"nri null del <0-32767> [<0-32767>]",
NRI_STR NULL_NRI_STR "Remove NRI value or range from the NRI mapping for this CN link\n"
NRI_FIRST_LAST_STR)
{
int rc;
const char *message;
struct hnbgw_cnpool *cnpool = vty->index;
rc = osmo_nri_ranges_vty_del(&message, NULL, cnpool->vty.null_nri_ranges, argc, argv);
if (message)
vty_out(vty, "%% %s: " NRI_ARGS_TO_STR_FMT "%s", message, NRI_ARGS_TO_STR_ARGS(argc, argv),
VTY_NEWLINE);
if (rc < 0)
return CMD_WARNING;
return CMD_SUCCESS;
}
/* Legacy from when there was only one IuCS and one IuPS peer. Instead, there are now 'msc 123' / 'sgsn 123' sub nodes.
* To yield legacy behavior, set the first cnlink config in this pool ('msc 0' / 'sgsn 0'). */
DEFUN_DEPRECATED(cfg_hnbgw_cnpool_remote_addr,
@ -436,6 +501,215 @@ DEFUN(cfg_cnlink_remote_addr,
return CMD_SUCCESS;
}
DEFUN_ATTR(cfg_cnlink_nri_add, cfg_cnlink_nri_add_cmd,
"nri add <0-32767> [<0-32767>]",
NRI_STR "Add NRI value or range to the NRI mapping for this CN link\n"
NRI_FIRST_LAST_STR,
CMD_ATTR_IMMEDIATE)
{
struct hnbgw_cnlink *cnlink = vty->index;
struct hnbgw_cnlink *other_cnlink;
bool before;
int rc;
const char *message;
struct osmo_nri_range added_range;
rc = osmo_nri_ranges_vty_add(&message, &added_range, cnlink->vty.nri_ranges, argc, argv, cnlink->pool->vty.nri_bitlen);
if (message)
NRI_WARN(cnlink, "%s: " NRI_ARGS_TO_STR_FMT, message, NRI_ARGS_TO_STR_ARGS(argc, argv));
if (rc < 0)
return CMD_WARNING;
/* Issue a warning about NRI range overlaps (but still allow them).
* Overlapping ranges will map to whichever CN link comes fist in the llist,
* which is not necessarily in the order of increasing cnlink->nr. */
before = true;
llist_for_each_entry(other_cnlink, &cnlink->pool->cnlinks, entry) {
if (other_cnlink == cnlink) {
before = false;
continue;
}
if (osmo_nri_range_overlaps_ranges(&added_range, other_cnlink->vty.nri_ranges)) {
NRI_WARN(cnlink, "NRI range [%d..%d] overlaps between %s %d and %s %d."
" For overlaps, %s %d has higher priority than %s %d",
added_range.first, added_range.last, cnlink->pool->peer_name, cnlink->nr,
other_cnlink->pool->peer_name, other_cnlink->nr,
(before ? other_cnlink : cnlink)->pool->peer_name,
(before ? other_cnlink : cnlink)->nr,
(before ? cnlink : other_cnlink)->pool->peer_name,
(before ? cnlink : other_cnlink)->nr);
}
}
return CMD_SUCCESS;
}
DEFUN_ATTR(cfg_cnlink_nri_del, cfg_cnlink_nri_del_cmd,
"nri del <0-32767> [<0-32767>]",
NRI_STR "Remove NRI value or range from the NRI mapping for this CN link\n"
NRI_FIRST_LAST_STR,
CMD_ATTR_IMMEDIATE)
{
struct hnbgw_cnlink *cnlink = vty->index;
int rc;
const char *message;
rc = osmo_nri_ranges_vty_del(&message, NULL, cnlink->vty.nri_ranges, argc, argv);
if (message)
NRI_WARN(cnlink, "%s: " NRI_ARGS_TO_STR_FMT, message, NRI_ARGS_TO_STR_ARGS(argc, argv));
if (rc < 0)
return CMD_WARNING;
return CMD_SUCCESS;
}
DEFUN_ATTR(cfg_cnlink_allow_attach, cfg_cnlink_allow_attach_cmd,
"allow-attach",
"Allow this CN link to attach new subscribers (default).\n",
CMD_ATTR_IMMEDIATE)
{
struct hnbgw_cnlink *cnlink = vty->index;
cnlink->allow_attach = true;
return CMD_SUCCESS;
}
DEFUN_ATTR(cfg_cnlink_no_allow_attach, cfg_cnlink_no_allow_attach_cmd,
"no allow-attach",
NO_STR
"Do not assign new subscribers to this CN link."
" Useful if an CN link in an CN link pool is configured to off-load subscribers."
" The CN link will still be operational for already IMSI-Attached subscribers,"
" but the NAS node selection function will skip this CN link for new subscribers\n",
CMD_ATTR_IMMEDIATE)
{
struct hnbgw_cnlink *cnlink = vty->index;
cnlink->allow_attach = false;
return CMD_SUCCESS;
}
DEFUN_ATTR(cfg_cnlink_allow_emerg,
cfg_cnlink_allow_emerg_cmd,
"allow-emergency",
"Allow CM ServiceRequests with type emergency on this CN link\n",
CMD_ATTR_IMMEDIATE)
{
struct hnbgw_cnlink *cnlink = vty->index;
cnlink->allow_emerg = true;
return CMD_SUCCESS;
}
DEFUN_ATTR(cfg_cnlink_no_allow_emerg,
cfg_cnlink_no_allow_emerg_cmd,
"no allow-emergency",
NO_STR
"Do not serve CM ServiceRequests with type emergency on this CN link\n",
CMD_ATTR_IMMEDIATE)
{
struct hnbgw_cnlink *cnlink = vty->index;
cnlink->allow_emerg = false;
return CMD_SUCCESS;
}
static void cnlink_write_nri(struct vty *vty, struct hnbgw_cnlink *cnlink, bool verbose)
{
struct osmo_nri_range *r;
if (verbose) {
vty_out(vty, "%s %d%s", cnlink->pool->peer_name, cnlink->nr, VTY_NEWLINE);
if (llist_empty(&cnlink->vty.nri_ranges->entries)) {
vty_out(vty, " %% no NRI mappings%s", VTY_NEWLINE);
return;
}
}
llist_for_each_entry(r, &cnlink->vty.nri_ranges->entries, entry) {
if (osmo_nri_range_validate(r, 255))
vty_out(vty, " %% INVALID RANGE:");
vty_out(vty, " nri add %d", r->first);
if (r->first != r->last)
vty_out(vty, " %d", r->last);
vty_out(vty, "%s", VTY_NEWLINE);
}
if (!cnlink->allow_attach)
vty_out(vty, " no allow-attach%s", VTY_NEWLINE);
if (cnlink->allow_emerg)
vty_out(vty, " allow-emergency%s", VTY_NEWLINE);
}
DEFUN(cfg_cnlink_show_nri, cfg_cnlink_show_nri_cmd,
"show nri",
SHOW_STR NRI_STR)
{
struct hnbgw_cnlink *cnlink = vty->index;
cnlink_write_nri(vty, cnlink, true);
return CMD_SUCCESS;
}
void cnlinks_write_nri(struct vty *vty, struct hnbgw_cnpool *cnpool, bool verbose)
{
struct hnbgw_cnlink *cnlink;
llist_for_each_entry(cnlink, &cnpool->cnlinks, entry)
cnlink_write_nri(vty, cnlink, verbose);
}
void cnpool_write_nri(struct vty *vty, struct hnbgw_cnpool *cnpool, bool verbose)
{
struct osmo_nri_range *r;
if (verbose)
vty_out(vty, " %s%s", cnpool->pool_name, VTY_NEWLINE);
if (verbose || cnpool->vty.nri_bitlen != OSMO_NRI_BITLEN_DEFAULT)
vty_out(vty, " nri bitlen %u%s", cnpool->vty.nri_bitlen, VTY_NEWLINE);
llist_for_each_entry(r, &cnpool->vty.null_nri_ranges->entries, entry) {
vty_out(vty, " nri null add %d", r->first);
if (r->first != r->last)
vty_out(vty, " %d", r->last);
vty_out(vty, "%s", VTY_NEWLINE);
}
if (verbose && llist_empty(&cnpool->vty.null_nri_ranges->entries))
vty_out(vty, " %% No NULL-NRI entries%s", VTY_NEWLINE);
}
DEFUN(show_nri, show_nri_cmd,
"show nri",
SHOW_STR NRI_STR)
{
/* hnbgw
* iucs
* nri null add ...
*/
vty_out(vty, "hnbgw%s", VTY_NEWLINE);
cnpool_write_nri(vty, &g_hnbgw->sccp.cnpool_iucs, true);
cnpool_write_nri(vty, &g_hnbgw->sccp.cnpool_iups, true);
/* msc 0
* nri add ...
*/
cnlinks_write_nri(vty, &g_hnbgw->sccp.cnpool_iucs, true);
cnlinks_write_nri(vty, &g_hnbgw->sccp.cnpool_iups, true);
return CMD_SUCCESS;
}
/* Hidden since it exists only for use by ttcn3 tests */
DEFUN_HIDDEN(cnpool_roundrobin_next, cnpool_roundrobin_next_cmd,
"cnpool roundrobin next (msc|sgsn) " CNLINK_NR_RANGE,
"CN pooling: load balancing across multiple CN links.\n"
"Adjust current state of the CN link round-robin algorithm (for testing).\n"
"Set the CN link nr to direct the next new subscriber to (for testing).\n"
"Set next MSC or next SGSN number\n"
"CN link number, as in the config file; if the number does not exist,"
" the round-robin continues to the next valid number.\n")
{
struct hnbgw_cnpool *cnpool;
if (!strcmp("msc", argv[0]))
cnpool = &g_hnbgw->sccp.cnpool_iucs;
else
cnpool = &g_hnbgw->sccp.cnpool_iups;
cnpool->round_robin_next_nr = atoi(argv[1]);
return CMD_SUCCESS;
}
#define APPLY_STR "Immediately use configuration modified via telnet VTY, and restart components as needed.\n"
#define SCCP_RESTART_STR \
" If 'remote-addr' changed, related SCCP links will be restarted, possibly dropping active UE contexts."
@ -518,6 +792,21 @@ DEFUN(cfg_pfcp_local_port, cfg_pfcp_local_port_cmd,
#endif /* ENABLE_PFCP */
/* hnbgw
* iucs } this part
* foo }
*/
static void _config_write_cnpool(struct vty *vty, struct hnbgw_cnpool *cnpool)
{
if (cnpool->vty.nri_bitlen == OSMO_NRI_BITLEN_DEFAULT
&& llist_empty(&cnpool->vty.null_nri_ranges->entries))
return;
vty_out(vty, " %s%s", cnpool->pool_name, VTY_NEWLINE);
cnpool_write_nri(vty, cnpool, false);
}
static int config_write_hnbgw(struct vty *vty)
{
vty_out(vty, "hnbgw%s", VTY_NEWLINE);
@ -528,6 +817,9 @@ static int config_write_hnbgw(struct vty *vty)
VTY_NEWLINE);
osmo_tdef_vty_groups_write(vty, " ");
_config_write_cnpool(vty, &g_hnbgw->sccp.cnpool_iucs);
_config_write_cnpool(vty, &g_hnbgw->sccp.cnpool_iups);
return CMD_SUCCESS;
}
@ -564,7 +856,7 @@ static void _config_write_cnlink(struct vty *vty, struct hnbgw_cnpool *cnpool)
vty_out(vty, "%s %d%s", cnpool->peer_name, cnlink->nr, VTY_NEWLINE);
if (cnlink->vty.remote_addr_name)
vty_out(vty, " remote-addr %s%s", cnlink->vty.remote_addr_name, VTY_NEWLINE);
/* FUTURE: NRI config */
cnlink_write_nri(vty, cnlink, false);
}
}
@ -596,7 +888,14 @@ static int config_write_hnbgw_pfcp(struct vty *vty)
static void install_cnlink_elements(int node)
{
install_element(node, &cfg_cnlink_remote_addr_cmd);
install_element(node, &cfg_cnlink_nri_add_cmd);
install_element(node, &cfg_cnlink_nri_del_cmd);
install_element(node, &cfg_cnlink_show_nri_cmd);
install_element(node, &cfg_cnlink_apply_sccp_cmd);
install_element(node, &cfg_cnlink_allow_attach_cmd);
install_element(node, &cfg_cnlink_no_allow_attach_cmd);
install_element(node, &cfg_cnlink_allow_emerg_cmd);
install_element(node, &cfg_cnlink_no_allow_emerg_cmd);
}
void hnbgw_vty_init(void)
@ -617,9 +916,15 @@ void hnbgw_vty_init(void)
install_element(HNBGW_NODE, &cfg_hnbgw_iucs_cmd);
install_node(&iucs_node, NULL);
install_element(IUCS_NODE, &cfg_hnbgw_cnpool_nri_bitlen_cmd);
install_element(IUCS_NODE, &cfg_hnbgw_cnpool_nri_null_add_cmd);
install_element(IUCS_NODE, &cfg_hnbgw_cnpool_nri_null_del_cmd);
install_element(HNBGW_NODE, &cfg_hnbgw_iups_cmd);
install_node(&iups_node, NULL);
install_element(IUPS_NODE, &cfg_hnbgw_cnpool_nri_bitlen_cmd);
install_element(IUPS_NODE, &cfg_hnbgw_cnpool_nri_null_add_cmd);
install_element(IUPS_NODE, &cfg_hnbgw_cnpool_nri_null_del_cmd);
/* deprecated: 'remote-addr' outside of 'msc 123' redirects to 'msc 0' / same for 'sgsn' */
install_element(IUCS_NODE, &cfg_hnbgw_cnpool_remote_addr_cmd);
@ -646,6 +951,8 @@ void hnbgw_vty_init(void)
install_element(PFCP_NODE, &cfg_pfcp_remote_addr_cmd);
#endif
osmo_tdef_vty_groups_init(HNBGW_NODE, hnbgw_tdef_group);
install_element(CONFIG_NODE, &cfg_msc_nr_cmd);
install_node(&msc_node, config_write_msc);
install_cnlink_elements(MSC_NODE);
@ -657,5 +964,6 @@ void hnbgw_vty_init(void)
/* global 'apply sccp' command. There are two more on MSC_NODE and SGSN_NODE from install_cnlink_elements(). */
install_element(CONFIG_NODE, &cfg_config_apply_sccp_cmd);
osmo_tdef_vty_groups_init(HNBGW_NODE, hnbgw_tdef_group);
install_element_ve(&show_nri_cmd);
install_element(ENABLE_NODE, &cnpool_roundrobin_next_cmd);
}

View File

@ -25,7 +25,7 @@ EXTRA_DIST = \
$(srcdir)/package.m4 \
$(TESTSUITE) \
osmo-hnbgw-vty-test.cfg \
osmo-hnbgw.vty \
$(srcdir)/*.vty \
$(srcdir)/config/*.cfg \
$(srcdir)/config/*.vty \
$(srcdir)/config/run_tests.sh \

View File

@ -2,6 +2,17 @@ OsmoHNBGW> enable
OsmoHNBGW# configure terminal
OsmoHNBGW(config)# ### cnpool doc strings
OsmoHNBGW(config)# list
...
apply sccp
...
OsmoHNBGW(config)# apply?
apply Immediately use configuration modified via telnet VTY, and restart components as needed.
OsmoHNBGW(config)# apply ?
sccp For telnet VTY: apply all SCCP and NRI config changes made to any CN pools and CN links in the running osmo-hnbgw process. If 'remote-addr' changed, related SCCP links will be restarted, possibly dropping active UE contexts. This is run implicitly on program startup, only useful to apply changes made later via telnet VTY.
OsmoHNBGW(config)# hnbgw
OsmoHNBGW(config-hnbgw)# list
...
@ -13,6 +24,79 @@ OsmoHNBGW(config-hnbgw)# iucs?
OsmoHNBGW(config-hnbgw)# iups?
iups Configure IuPS options
OsmoHNBGW(config-hnbgw)# iucs
OsmoHNBGW(config-hnbgw-iucs)# list
...
nri bitlen <1-15>
nri null add <0-32767> [<0-32767>]
nri null del <0-32767> [<0-32767>]
...
OsmoHNBGW(config-hnbgw-iucs)# nri?
nri Mapping of Network Resource Indicators to this CN peer, for CN pooling
OsmoHNBGW(config-hnbgw-iucs)# nri ?
bitlen Set number of bits that an NRI has, to extract from TMSI identities (always starting just after the TMSI's most significant octet).
null Define NULL-NRI values that cause re-assignment of an MS to a different CN peer, for CN pooling.
OsmoHNBGW(config-hnbgw-iucs)# nri bitlen ?
<1-15> bit count (default: 10)
OsmoHNBGW(config-hnbgw-iucs)# nri null ?
add Add NULL-NRI value (or range)
del Remove NRI value or range from the NRI mapping for this CN link
OsmoHNBGW(config-hnbgw-iucs)# nri null add ?
<0-32767> First value of the NRI value range, should not surpass the configured 'nri bitlen'.
OsmoHNBGW(config-hnbgw-iucs)# nri null add 0 ?
[<0-32767>] Last value of the NRI value range, should not surpass the configured 'nri bitlen' and be larger than the first value; if omitted, apply only the first value.
OsmoHNBGW(config-hnbgw-iucs)# nri null del ?
<0-32767> First value of the NRI value range, should not surpass the configured 'nri bitlen'.
OsmoHNBGW(config-hnbgw-iucs)# nri null del 0 ?
[<0-32767>] Last value of the NRI value range, should not surpass the configured 'nri bitlen' and be larger than the first value; if omitted, apply only the first value.
OsmoHNBGW(config-hnbgw-iucs)# exit
OsmoHNBGW(config-hnbgw)# iups
OsmoHNBGW(config-hnbgw-iups)# list
...
nri bitlen <1-15>
nri null add <0-32767> [<0-32767>]
nri null del <0-32767> [<0-32767>]
...
OsmoHNBGW(config-hnbgw-iups)# nri?
nri Mapping of Network Resource Indicators to this CN peer, for CN pooling
OsmoHNBGW(config-hnbgw-iups)# nri ?
bitlen Set number of bits that an NRI has, to extract from TMSI identities (always starting just after the TMSI's most significant octet).
null Define NULL-NRI values that cause re-assignment of an MS to a different CN peer, for CN pooling.
OsmoHNBGW(config-hnbgw-iups)# nri bitlen ?
<1-15> bit count (default: 10)
OsmoHNBGW(config-hnbgw-iups)# nri null ?
add Add NULL-NRI value (or range)
del Remove NRI value or range from the NRI mapping for this CN link
OsmoHNBGW(config-hnbgw-iups)# nri null add ?
<0-32767> First value of the NRI value range, should not surpass the configured 'nri bitlen'.
OsmoHNBGW(config-hnbgw-iups)# nri null add 0 ?
[<0-32767>] Last value of the NRI value range, should not surpass the configured 'nri bitlen' and be larger than the first value; if omitted, apply only the first value.
OsmoHNBGW(config-hnbgw-iups)# nri null del ?
<0-32767> First value of the NRI value range, should not surpass the configured 'nri bitlen'.
OsmoHNBGW(config-hnbgw-iups)# nri null del 0 ?
[<0-32767>] Last value of the NRI value range, should not surpass the configured 'nri bitlen' and be larger than the first value; if omitted, apply only the first value.
OsmoHNBGW(config-hnbgw-iups)# exit
OsmoHNBGW(config-hnbgw)# exit
OsmoHNBGW(config)# msc?
@ -37,7 +121,14 @@ OsmoHNBGW(config)# msc 1
OsmoHNBGW(config-msc)# list
...
remote-addr NAME
nri add <0-32767> [<0-32767>]
nri del <0-32767> [<0-32767>]
show nri
apply sccp
allow-attach
no allow-attach
allow-emergency
no allow-emergency
...
OsmoHNBGW(config-msc)# remote-addr?
@ -45,11 +136,25 @@ OsmoHNBGW(config-msc)# remote-addr?
OsmoHNBGW(config-msc)# remote-addr ?
NAME SCCP address book entry name (see 'cs7 instance' / 'sccp-address')
OsmoHNBGW(config-msc)# show nri?
nri Mapping of Network Resource Indicators to this CN peer, for CN pooling
OsmoHNBGW(config-msc)# apply?
apply Immediately use configuration modified via telnet VTY, and restart components as needed.
OsmoHNBGW(config-msc)# apply ?
sccp For telnet VTY: apply SCCP and NRI config changes made to this CN link in the running osmo-hnbgw process. If 'remote-addr' changed, related SCCP links will be restarted, possibly dropping active UE contexts. This is run implicitly on program startup, only useful to apply changes made later via telnet VTY.
OsmoHNBGW(config-msc)# allow-attach?
allow-attach Allow this CN link to attach new subscribers (default).
OsmoHNBGW(config-msc)# allow-emergency?
allow-emergency Allow CM ServiceRequests with type emergency on this CN link
OsmoHNBGW(config-msc)# no ?
allow-attach Do not assign new subscribers to this CN link. Useful if an CN link in an CN link pool is configured to off-load subscribers. The CN link will still be operational for already IMSI-Attached subscribers, but the NAS node selection function will skip this CN link for new subscribers
allow-emergency Do not serve CM ServiceRequests with type emergency on this CN link
OsmoHNBGW(config-msc)# exit
OsmoHNBGW(config)# sgsn 1
@ -57,7 +162,14 @@ OsmoHNBGW(config)# sgsn 1
OsmoHNBGW(config-sgsn)# list
...
remote-addr NAME
nri add <0-32767> [<0-32767>]
nri del <0-32767> [<0-32767>]
show nri
apply sccp
allow-attach
no allow-attach
allow-emergency
no allow-emergency
...
OsmoHNBGW(config-sgsn)# remote-addr?
@ -65,11 +177,25 @@ OsmoHNBGW(config-sgsn)# remote-addr?
OsmoHNBGW(config-sgsn)# remote-addr ?
NAME SCCP address book entry name (see 'cs7 instance' / 'sccp-address')
OsmoHNBGW(config-sgsn)# show nri?
nri Mapping of Network Resource Indicators to this CN peer, for CN pooling
OsmoHNBGW(config-sgsn)# apply?
apply Immediately use configuration modified via telnet VTY, and restart components as needed.
OsmoHNBGW(config-sgsn)# apply ?
sccp For telnet VTY: apply SCCP and NRI config changes made to this CN link in the running osmo-hnbgw process. If 'remote-addr' changed, related SCCP links will be restarted, possibly dropping active UE contexts. This is run implicitly on program startup, only useful to apply changes made later via telnet VTY.
OsmoHNBGW(config-sgsn)# allow-attach?
allow-attach Allow this CN link to attach new subscribers (default).
OsmoHNBGW(config-sgsn)# allow-emergency?
allow-emergency Allow CM ServiceRequests with type emergency on this CN link
OsmoHNBGW(config-sgsn)# no ?
allow-attach Do not assign new subscribers to this CN link. Useful if an CN link in an CN link pool is configured to off-load subscribers. The CN link will still be operational for already IMSI-Attached subscribers, but the NAS node selection function will skip this CN link for new subscribers
allow-emergency Do not serve CM ServiceRequests with type emergency on this CN link
OsmoHNBGW(config-sgsn)# exit
OsmoHNBGW(config)# ### Just by entering the nodes above, 'msc 1' and 'sgsn 1' now exist
@ -85,10 +211,12 @@ OsmoHNBGW(config)# ### Add {msc,sgsn}x{2,3}
OsmoHNBGW(config)# msc 2
OsmoHNBGW(config-msc)# remote-addr addr-msc2
OsmoHNBGW(config-msc)# no allow-attach
OsmoHNBGW(config-msc)# exit
OsmoHNBGW(config)# msc 3
OsmoHNBGW(config-msc)# remote-addr addr-msc3
OsmoHNBGW(config-msc)# allow-emergency
OsmoHNBGW(config-msc)# exit
OsmoHNBGW(config)# sgsn 2
@ -105,8 +233,10 @@ msc 0
msc 1
msc 2
remote-addr addr-msc2
no allow-attach
msc 3
remote-addr addr-msc3
allow-emergency
sgsn 0
sgsn 1
sgsn 2
@ -116,8 +246,12 @@ sgsn 3
...
OsmoHNBGW(config)# ### Re-entering existing nodes works (does not create new ones)
OsmoHNBGW(config)# msc 2
OsmoHNBGW(config-msc)# allow-attach
OsmoHNBGW(config-msc)# exit
OsmoHNBGW(config)# msc 3
OsmoHNBGW(config-msc)# remote-addr addr-msc4
OsmoHNBGW(config-msc)# no allow-emergency
OsmoHNBGW(config-msc)# exit
OsmoHNBGW(config)# sgsn 2
OsmoHNBGW(config-sgsn)# remote-addr addr-sgsn4

279
tests/nri_cfg.vty Normal file
View File

@ -0,0 +1,279 @@
OsmoHNBGW> show nri
hnbgw
iucs
nri bitlen 10
% No NULL-NRI entries
iups
nri bitlen 10
% No NULL-NRI entries
msc 0
% no NRI mappings
sgsn 0
% no NRI mappings
OsmoHNBGW> enable
OsmoHNBGW# configure terminal
OsmoHNBGW(config)# msc 0
OsmoHNBGW(config-msc)# list
...
nri add <0-32767> [<0-32767>]
nri del <0-32767> [<0-32767>]
show nri
...
OsmoHNBGW(config-msc)# nri ?
add Add NRI value or range to the NRI mapping for this CN link
del Remove NRI value or range from the NRI mapping for this CN link
OsmoHNBGW(config-msc)# nri add ?
<0-32767> First value of the NRI value range, should not surpass the configured 'nri bitlen'.
OsmoHNBGW(config-msc)# nri add 23 ?
[<0-32767>] Last value of the NRI value range, should not surpass the configured 'nri bitlen' and be larger than the first value; if omitted, apply only the first value.
OsmoHNBGW(config-msc)# nri add 23
OsmoHNBGW(config-msc)# nri add 256 511
OsmoHNBGW(config-msc)# nri add 100 200
OsmoHNBGW(config-msc)# nri add 1024 1024
% Warning: msc 0: Warning: NRI range surpasses current NRI bitlen: 1024..1024
OsmoHNBGW(config-msc)# show nri
msc 0
nri add 23
nri add 100 200
nri add 256 511
nri add 1024
OsmoHNBGW(config-msc)# exit
OsmoHNBGW(config)# ### Do msc 2 first, to see that the order of mscs in the internal list is not determined by the msc->nr,
OsmoHNBGW(config)# ### and whichever was configured first gets higher priority for overlaps.
OsmoHNBGW(config)# msc 2
OsmoHNBGW(config-msc)# nri add 200 300
% Warning: msc 2: NRI range [200..300] overlaps between msc 2 and msc 0. For overlaps, msc 0 has higher priority than msc 2
OsmoHNBGW(config-msc)# nri add 1024 1025
% Warning: msc 2: Warning: NRI range surpasses current NRI bitlen: 1024..1025
% Warning: msc 2: NRI range [1024..1025] overlaps between msc 2 and msc 0. For overlaps, msc 0 has higher priority than msc 2
OsmoHNBGW(config-msc)# exit
OsmoHNBGW(config)# msc 1
OsmoHNBGW(config-msc)# nri add 42
OsmoHNBGW(config-msc)# nri add 512 767
OsmoHNBGW(config-msc)# nri add 200 300
% Warning: msc 1: NRI range [200..300] overlaps between msc 1 and msc 0. For overlaps, msc 0 has higher priority than msc 1
% Warning: msc 1: NRI range [200..300] overlaps between msc 1 and msc 2. For overlaps, msc 2 has higher priority than msc 1
OsmoHNBGW(config-msc)# nri add 1024 1025
% Warning: msc 1: Warning: NRI range surpasses current NRI bitlen: 1024..1025
% Warning: msc 1: NRI range [1024..1025] overlaps between msc 1 and msc 0. For overlaps, msc 0 has higher priority than msc 1
% Warning: msc 1: NRI range [1024..1025] overlaps between msc 1 and msc 2. For overlaps, msc 2 has higher priority than msc 1
OsmoHNBGW(config-msc)# show nri
msc 1
nri add 42
nri add 200 300
nri add 512 767
nri add 1024 1025
OsmoHNBGW(config-msc)# exit
OsmoHNBGW(config)# do show nri
hnbgw
iucs
nri bitlen 10
% No NULL-NRI entries
iups
nri bitlen 10
% No NULL-NRI entries
msc 0
nri add 23
nri add 100 200
nri add 256 511
nri add 1024
msc 2
nri add 200 300
nri add 1024 1025
msc 1
nri add 42
nri add 200 300
nri add 512 767
nri add 1024 1025
sgsn 0
% no NRI mappings
OsmoHNBGW(config)# ### msc and sgsn have separate scopes of NRI, i.e. overlaps are no problem
OsmoHNBGW(config)# sgsn 0
OsmoHNBGW(config-sgsn)# nri add 0 1023
OsmoHNBGW(config-sgsn)# show nri
sgsn 0
nri add 0 1023
OsmoHNBGW(config-sgsn)# exit
OsmoHNBGW(config)# ### NULL-NRI config
OsmoHNBGW(config)# hnbgw
OsmoHNBGW(config-hnbgw)# iucs
OsmoHNBGW(config-hnbgw-iucs)# list
...
nri bitlen <1-15>
nri null add <0-32767> [<0-32767>]
nri null del <0-32767> [<0-32767>]
...
OsmoHNBGW(config-hnbgw-iucs)# nri ?
bitlen Set number of bits that an NRI has, to extract from TMSI identities (always starting just after the TMSI's most significant octet).
null Define NULL-NRI values that cause re-assignment of an MS to a different CN peer, for CN pooling.
OsmoHNBGW(config-hnbgw-iucs)# nri bitlen ?
<1-15> bit count (default: 10)
OsmoHNBGW(config-hnbgw-iucs)# nri bitlen 11
OsmoHNBGW(config-hnbgw-iucs)# show running-config
...
hnbgw
...
iucs
...
nri bitlen 11
...
OsmoHNBGW(config-hnbgw-iucs)# nri null ?
add Add NULL-NRI value (or range)
del Remove NRI value or range from the NRI mapping for this CN link
OsmoHNBGW(config-hnbgw-iucs)# nri null add ?
<0-32767> First value of the NRI value range, should not surpass the configured 'nri bitlen'.
OsmoHNBGW(config-hnbgw-iucs)# nri null add 0 ?
[<0-32767>] Last value of the NRI value range, should not surpass the configured 'nri bitlen' and be larger than the first value; if omitted, apply only the first value.
OsmoHNBGW(config-hnbgw-iucs)# nri null del ?
<0-32767> First value of the NRI value range, should not surpass the configured 'nri bitlen'.
OsmoHNBGW(config-hnbgw-iucs)# nri null del 0 ?
[<0-32767>] Last value of the NRI value range, should not surpass the configured 'nri bitlen' and be larger than the first value; if omitted, apply only the first value.
OsmoHNBGW(config-hnbgw-iucs)# exit
OsmoHNBGW(config-hnbgw)# iups
OsmoHNBGW(config-hnbgw-iups)# list
...
nri bitlen <1-15>
nri null add <0-32767> [<0-32767>]
nri null del <0-32767> [<0-32767>]
...
OsmoHNBGW(config-hnbgw-iups)# nri ?
bitlen Set number of bits that an NRI has, to extract from TMSI identities (always starting just after the TMSI's most significant octet).
null Define NULL-NRI values that cause re-assignment of an MS to a different CN peer, for CN pooling.
OsmoHNBGW(config-hnbgw-iups)# nri bitlen ?
<1-15> bit count (default: 10)
OsmoHNBGW(config-hnbgw-iups)# nri bitlen 9
OsmoHNBGW(config-hnbgw-iups)# show running-config
...
hnbgw
...
iups
...
nri bitlen 9
...
OsmoHNBGW(config-hnbgw-iups)# nri null ?
add Add NULL-NRI value (or range)
del Remove NRI value or range from the NRI mapping for this CN link
OsmoHNBGW(config-hnbgw-iups)# nri null add ?
<0-32767> First value of the NRI value range, should not surpass the configured 'nri bitlen'.
OsmoHNBGW(config-hnbgw-iups)# nri null add 0 ?
[<0-32767>] Last value of the NRI value range, should not surpass the configured 'nri bitlen' and be larger than the first value; if omitted, apply only the first value.
OsmoHNBGW(config-hnbgw-iups)# nri null del ?
<0-32767> First value of the NRI value range, should not surpass the configured 'nri bitlen'.
OsmoHNBGW(config-hnbgw-iups)# nri null del 0 ?
[<0-32767>] Last value of the NRI value range, should not surpass the configured 'nri bitlen' and be larger than the first value; if omitted, apply only the first value.
OsmoHNBGW(config-hnbgw-iups)# exit
OsmoHNBGW(config-hnbgw)# exit
OsmoHNBGW(config)# msc 0
OsmoHNBGW(config-msc)# nri del 0 10000
OsmoHNBGW(config-msc)# exit
OsmoHNBGW(config)# msc 1
OsmoHNBGW(config-msc)# nri del 0 10000
OsmoHNBGW(config-msc)# exit
OsmoHNBGW(config)# msc 2
OsmoHNBGW(config-msc)# nri del 0 10000
OsmoHNBGW(config-msc)# exit
OsmoHNBGW(config)# do show nri
hnbgw
iucs
nri bitlen 11
% No NULL-NRI entries
iups
nri bitlen 9
% No NULL-NRI entries
msc 0
% no NRI mappings
msc 2
% no NRI mappings
msc 1
% no NRI mappings
sgsn 0
nri add 0 1023
OsmoHNBGW(config)# msc 0
OsmoHNBGW(config-msc)# nri add 0 1000
OsmoHNBGW(config-msc)# show nri
msc 0
nri add 0 1000
OsmoHNBGW(config-msc)# nri del 23
OsmoHNBGW(config-msc)# nri del 200 300
OsmoHNBGW(config-msc)# nri del 1000 2000
OsmoHNBGW(config-msc)# show nri
msc 0
nri add 0 22
nri add 24 199
nri add 301 999
OsmoHNBGW(config-msc)# nri add 23
OsmoHNBGW(config-msc)# show nri
msc 0
nri add 0 199
nri add 301 999
OsmoHNBGW(config-msc)# nri add 200 300
OsmoHNBGW(config-msc)# show nri
msc 0
nri add 0 999
OsmoHNBGW(config-msc)# nri add 1000
OsmoHNBGW(config-msc)# show nri
msc 0
nri add 0 1000
OsmoHNBGW(config-msc)# show running-config
... ! no allow-attach
OsmoHNBGW(config-msc)# no allow-attach
OsmoHNBGW(config-msc)# show running-config
...
msc 0
...
nri add 0 1000
no allow-attach
... ! no allow-attach
OsmoHNBGW(config-msc)# exit
OsmoHNBGW(config)# sgsn 1
OsmoHNBGW(config-sgsn)# no allow-attach
OsmoHNBGW(config-sgsn)# show running-config
...
msc 0
...
nri add 0 1000
no allow-attach
... ! no allow-attach
sgsn 1
...
no allow-attach
...
OsmoHNBGW(config-sgsn)# allow-attach
OsmoHNBGW(config-sgsn)# exit
OsmoHNBGW(config)# msc 0
OsmoHNBGW(config-msc)# allow-attach
OsmoHNBGW(config-msc)# show running-config
... ! no allow-attach
OsmoHNBGW(config-msc)# exit