diff options
author | Ivan Kluchnikov <kluchnikovi@gmail.com> | 2016-04-08 10:44:28 +0300 |
---|---|---|
committer | Ivan Kluchnikov <kluchnikovi@gmail.com> | 2016-04-19 14:40:27 +0300 |
commit | 7be811ed95d004f92d98880bc8eaef6c28c3373d (patch) | |
tree | 5c43f66712d36d3717f6d8c460e0d24c413cfe9e /openbsc/src/libcommon/gsm_data.c | |
parent | 687f048ab04ed135eeb11deb29e6b4cb9727c27d (diff) |
Add support of virtual networks for sending network name to ms depending on imsifairwaves/virt-net
Before sending mm info message to ms:
- try to find virtual network with the imsi prefix which matches subscriber's imsi
- if virtual network was found, use long and short network names of this virtual network for subscriber
- if virtual network was not found, use long and short network names of main network for subscriber
Diffstat (limited to 'openbsc/src/libcommon/gsm_data.c')
-rw-r--r-- | openbsc/src/libcommon/gsm_data.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/openbsc/src/libcommon/gsm_data.c b/openbsc/src/libcommon/gsm_data.c index 16035edcc..d75e7afef 100644 --- a/openbsc/src/libcommon/gsm_data.c +++ b/openbsc/src/libcommon/gsm_data.c @@ -192,6 +192,46 @@ const char *rrlp_mode_name(enum rrlp_mode mode) return get_value_string(rrlp_mode_names, mode); } +struct gsm_virt_network *gsm_virt_net_alloc(void *ctx) +{ + struct gsm_virt_network *virt_net = talloc_zero(ctx, struct gsm_virt_network); + if (!virt_net) + return NULL; + return virt_net; +} + +struct gsm_virt_network *gsm_virt_net_alloc_register(struct gsm_network *net) +{ + struct gsm_virt_network *virt_net; + + virt_net = gsm_virt_net_alloc(net); + if (!virt_net) + return NULL; + + virt_net->nr = net->num_virt_net++; + virt_net->network = net; + virt_net->name_short = talloc_strdup(net, "OpenBSC"); + virt_net->name_long = talloc_strdup(net, "OpenBSC"); + + llist_add_tail(&virt_net->list, &net->virt_net_list); + return virt_net; +} + +struct gsm_virt_network *gsm_virt_net_num(struct gsm_network *net, int num) +{ + struct gsm_virt_network *virt_net; + + if (num >= net->num_virt_net) + return NULL; + + llist_for_each_entry(virt_net, &net->virt_net_list, list) { + if (virt_net->nr == num) + return virt_net; + } + + return NULL; +} + static const struct value_string bts_gprs_mode_names[] = { { BTS_GPRS_NONE, "none" }, { BTS_GPRS_GPRS, "gprs" }, |