aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src/libiu/iu_vty.c
blob: 0b42e34844fdba33b9e05c179bab162f0f121cdf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/* OpenBSC Iu related interface to quagga VTY */
/* (C) 2016 by sysmocom s.m.f.c. GmbH <info@sysmocom.de>
 * 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 <http://www.gnu.org/licenses/>.
 *
 */

#include <stdlib.h>
#include <string.h>

#include <osmocom/core/logging.h>
#include <osmocom/vty/command.h>
#include <osmocom/vty/logging.h>
#include <osmocom/sigtran/osmo_ss7.h>
#include <osmocom/sigtran/sccp_sap.h>

#include <openbsc/iu.h>

static enum nsap_addr_enc *g_rab_assign_addr_enc = NULL;

DEFUN(logging_asn_debug,
      logging_asn_debug_cmd,
      "logging asn1-debug (1|0)",
      LOGGING_STR
      "Log ASN.1 debug messages to stderr\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(logging_asn_xer_print,
      logging_asn_xer_print_cmd,
      "logging asn1-xer-print (1|0)",
      LOGGING_STR
      "Log human readable representations of all ASN.1 messages to stderr\n"
      "Log decoded 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 = NSAP_ADDR_ENC_V4RAW;
	else
		*g_rab_assign_addr_enc = 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 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 NSAP_ADDR_ENC_V4RAW:
		vty_out(vty, "%siu rab-assign-addr-enc v4raw%s", indent,
			VTY_NEWLINE);
		break;
	case NSAP_ADDR_ENC_X213:
		/* default value, no need to write anything */
		break;
	default:
		LOGP(0, LOGL_ERROR, "Invalid value for"
		     " net.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);

	return CMD_SUCCESS;
}

void iu_vty_init(int iu_parent_node, enum nsap_addr_enc *rab_assign_addr_enc)
{
	g_rab_assign_addr_enc = rab_assign_addr_enc;

	install_element(CFG_LOG_NODE, &logging_asn_debug_cmd);
	install_element(CFG_LOG_NODE, &logging_asn_xer_print_cmd);
	install_element(iu_parent_node, &cfg_iu_rab_assign_addr_enc_cmd);
	install_element(iu_parent_node, &cfg_iu_local_addr_pc_cmd);
}