From aae68b2791c636b6a58068bb43cf4c01cfd86c5d Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Wed, 5 Jul 2017 14:38:52 +0200 Subject: move openbsc.git's iu.h, iu.c, iu_vty.c here as iu_client To help split openbsc.git to separate MSC and SGSN repositories, place the common Iu interface related code here in libosmo-ranap. Also apply various improvements while moving (from intermittent code review). The code depends on libosmo-ranap tightly. One reason to want this separate from libosmo-ranap could be that it uses libosmo-sigtran, accepting an sccp instance. However, including in libosmo-ranap is the simplest way to go. The osmo-iuh build depends on libosmo-sigtran anyway because of OsmoHNBGW, and all current users of libosmo-ranap also naturally link libosmo-sigtran already. Apply prefix ranap_iu_ and RANAP_IU_ to allow smooth transition from the openbsc.git iu_ to the libranap ranap_iu_ implementations. Prune unneeded #include statements. Instead of sccp_addr, store an rnc pointer in the ue_conn_ctx. To facilitate, also: - Move iu_rnc struct to iu_client.h (as ranap_iu_rnc). - Instead of sccp_addr, pass rnc to ue_conn_ctx_alloc(). - Pass a local struct new_ue_conn_ctx containing the sccp_addr and conn_id up the RANAP handling stack in case of an InitialUE message. - Separate the InitialUE message handling from cn_ranap_handle_co(), by moving to new and separate cn_ranap_handle_co_initial(), so we can still pass a looked-up ue_conn_ctx to all other cn_ranap_handle_co() code paths. - Allocate the ue_conn_ctx only in ranap_handle_co_initial_ue(), not as early as before. Note that we are not actually ever using the rnc pointer now present in ue_conn_ctx. It could be used for more concise paging, to first page only the RNC where we last saw the subscriber. So far we page all matching LAC/RACs. Tweak error logging: use __func__ instead of writing the function names as string constants. In iu_client_vty.c: - Move the asn.1 debug commands from logging over to the iu node. They are not specific to the logging target. They could qualify for an entirely separate 'asn1' root node, but for simplicity place under 'iu'. - Add the 'asn1' commands to ranap_iu_vty_config_write(), so far missing. - remove the legacy "net." from a VTY error message, it is not known which name the parent node of 'iu' has. Depends: libosmo-sccp I85b46269dbe7909e52873ace3f720f6292a4516c, libosmo-sccp Ie1aedd7894acd69ddc887cd65a8a0df4b888838c Change-Id: I6a3f7ad15be03fb94689b4af6ccfa828c25f45c0 --- src/iu_client_vty.c | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 src/iu_client_vty.c (limited to 'src/iu_client_vty.c') diff --git a/src/iu_client_vty.c b/src/iu_client_vty.c new file mode 100644 index 0000000..b809b2a --- /dev/null +++ b/src/iu_client_vty.c @@ -0,0 +1,140 @@ +/* OpenBSC Iu related interface to quagga VTY */ +/* (C) 2016 by sysmocom s.m.f.c. GmbH + * All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +#include +#include + +#include +#include +#include +#include +#include + +#include + +static enum ranap_nsap_addr_enc *g_rab_assign_addr_enc = NULL; + +DEFUN(cfg_iu_asn1_debug, + cfg_iu_asn1_debug_cmd, + "asn1 debug (1|0)", + "ASN.1 settings\n" + "Enable ASN.1 debug messages\n" + "Log ASN.1 debug messages to stderr\n" + "Do not log ASN.1 debug messages to stderr\n") +{ + asn_debug = atoi(argv[0]); + return CMD_SUCCESS; +} + +DEFUN(cfg_iu_asn1_xer_print, + cfg_iu_asn1_xer_print_cmd, + "asn1 xer-print (1|0)", + "ASN.1 settings\n" + "Log human readable representations of all ASN.1 messages to stderr\n" + "Log XML representation of all ASN.1 messages to stderr\n" + "Do not log decoded ASN.1 messages to stderr\n") +{ + asn1_xer_print = atoi(argv[0]); + return CMD_SUCCESS; +} + +#define IU_STR "Iu interface protocol options\n" +DEFUN(cfg_iu_rab_assign_addr_enc, cfg_iu_rab_assign_addr_enc_cmd, + "iu rab-assign-addr-enc (x213|v4raw)", + IU_STR + "Choose RAB Assignment's Transport Layer Address encoding\n" + "ITU-T X.213 compliant address encoding (default)\n" + "32bit length raw IPv4 address (for ip.access nano3G)\n") +{ + if (!g_rab_assign_addr_enc) { + vty_out(vty, "%%RAB Assignment Transport Layer Address" + " encoding not available%s", VTY_NEWLINE); + return CMD_WARNING; + } + + if (strcmp(argv[0], "v4raw") == 0) + *g_rab_assign_addr_enc = RANAP_NSAP_ADDR_ENC_V4RAW; + else + *g_rab_assign_addr_enc = RANAP_NSAP_ADDR_ENC_X213; + return CMD_SUCCESS; +} + +extern struct osmo_sccp_addr local_sccp_addr; + +DEFUN(cfg_iu_local_addr_pc, cfg_iu_local_addr_pc_cmd, + "iu local-address point-code PC", + IU_STR "Local SCCP Address\n") +{ + local_sccp_addr.presence = OSMO_SCCP_ADDR_T_PC | OSMO_SCCP_ADDR_T_SSN; + local_sccp_addr.ri = OSMO_SCCP_RI_SSN_PC; + local_sccp_addr.pc = osmo_ss7_pointcode_parse(NULL, argv[0]); + + return CMD_SUCCESS; +} + +/* TODO: GT address configuration, in line with 4.5.1.1.1 of TS 25.410 */ + +int ranap_iu_vty_config_write(struct vty *vty, const char *indent) +{ + if (!g_rab_assign_addr_enc) { + vty_out(vty, "%%RAB Assignment Transport Layer Address" + " encoding not available%s", VTY_NEWLINE); + return CMD_WARNING; + } + + switch (*g_rab_assign_addr_enc) { + case RANAP_NSAP_ADDR_ENC_V4RAW: + vty_out(vty, "%siu rab-assign-addr-enc v4raw%s", indent, + VTY_NEWLINE); + break; + case RANAP_NSAP_ADDR_ENC_X213: + /* default value, no need to write anything */ + break; + default: + LOGP(0, LOGL_ERROR, "Invalid value for" + " iu.rab_assign_addr_enc: %d\n", + *g_rab_assign_addr_enc); + return CMD_WARNING; + } + + vty_out(vty, "%siu local-address point-code %s%s", indent, + osmo_ss7_pointcode_print(NULL, local_sccp_addr.pc), VTY_NEWLINE); + + if (asn_debug) + vty_out(vty, "%sasn1 debug 1%s", indent, VTY_NEWLINE); + + if (asn1_xer_print) + vty_out(vty, "%sasn1 xer-print 1%s", indent, VTY_NEWLINE); + + return CMD_SUCCESS; +} + +void ranap_iu_vty_init(int iu_parent_node, enum ranap_nsap_addr_enc *rab_assign_addr_enc) +{ + g_rab_assign_addr_enc = rab_assign_addr_enc; + + install_element(iu_parent_node, &cfg_iu_rab_assign_addr_enc_cmd); + install_element(iu_parent_node, &cfg_iu_local_addr_pc_cmd); + + /* Technically, these are global ASN.1 settings and not necessarily limited to the Iu interface. + * Practically, only Iu users will use ASN.1 in Osmocom programs -- at least so far. So it is + * easiest to have these commands under 'iu'. */ + install_element(iu_parent_node, &cfg_iu_asn1_debug_cmd); + install_element(iu_parent_node, &cfg_iu_asn1_xer_print_cmd); +} -- cgit v1.2.3