blob: d04641d9de4d2cd76bd9a625c212b06332d1210d [file] [log] [blame]
Neels Hofmeyr17518fe2017-06-20 04:35:06 +02001/*! \file gprs_bssgp_vty.c
2 * VTY interface for our GPRS BSS Gateway Protocol (BSSGP) implementation. */
3/*
4 * (C) 2010 by Harald Welte <laforge@gnumonks.org>
Harald Welte4e5721d2010-05-17 23:41:43 +02005 *
6 * All Rights Reserved
7 *
Harald Weltee08da972017-11-13 01:00:26 +09008 * SPDX-License-Identifier: GPL-2.0+
9 *
Harald Welte4e5721d2010-05-17 23:41:43 +020010 * This program is free software; you can redistribute it and/or modify
Harald Welte7fa89c22014-10-26 20:33:09 +010011 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
Harald Welte4e5721d2010-05-17 23:41:43 +020013 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Harald Welte7fa89c22014-10-26 20:33:09 +010018 * GNU General Public License for more details.
Harald Welte4e5721d2010-05-17 23:41:43 +020019 *
Harald Welte7fa89c22014-10-26 20:33:09 +010020 * You should have received a copy of the GNU General Public License
Harald Weltee4cbb3f2011-01-01 15:25:50 +010021 * along with this program. If not, see <http://www.gnu.org/licenses/>.
Harald Welte4e5721d2010-05-17 23:41:43 +020022 *
23 */
24
25#include <stdlib.h>
26#include <unistd.h>
27#include <errno.h>
28#include <stdint.h>
29
30#include <arpa/inet.h>
31
Pablo Neira Ayusoff663232011-03-22 16:47:59 +010032#include <osmocom/core/msgb.h>
33#include <osmocom/gsm/tlv.h>
34#include <osmocom/core/talloc.h>
35#include <osmocom/core/select.h>
36#include <osmocom/core/rate_ctr.h>
Harald Welte73952e32012-06-16 14:59:56 +080037#include <osmocom/gprs/gprs_ns.h>
38#include <osmocom/gprs/gprs_bssgp.h>
Maxea507322016-03-31 21:40:26 +020039#include <osmocom/gprs/gprs_bssgp_bss.h>
Harald Welte4e5721d2010-05-17 23:41:43 +020040
Harald Welteac1a7152010-05-19 19:45:32 +020041#include <osmocom/vty/vty.h>
42#include <osmocom/vty/command.h>
43#include <osmocom/vty/logging.h>
44#include <osmocom/vty/telnet_interface.h>
Pablo Neira Ayuso167281e2011-03-28 19:35:00 +020045#include <osmocom/vty/misc.h>
Harald Welte4e5721d2010-05-17 23:41:43 +020046
Harald Weltef5430362012-06-17 12:25:53 +080047static void log_set_bvc_filter(struct log_target *target,
48 struct bssgp_bvc_ctx *bctx)
49{
50 if (bctx) {
Neels Hofmeyr8b86cd72017-02-23 18:03:28 +010051 target->filter_map |= (1 << LOG_FLT_GB_BVC);
52 target->filter_data[LOG_FLT_GB_BVC] = bctx;
53 } else if (target->filter_data[LOG_FLT_GB_BVC]) {
54 target->filter_map = ~(1 << LOG_FLT_GB_BVC);
55 target->filter_data[LOG_FLT_GB_BVC] = NULL;
Harald Weltef5430362012-06-17 12:25:53 +080056 }
57}
58
Harald Welte4e5721d2010-05-17 23:41:43 +020059static struct cmd_node bssgp_node = {
Harald Welte4f5883b2012-06-16 16:54:06 +080060 L_BSSGP_NODE,
Neels Hofmeyr6f417672017-09-25 00:57:00 +020061 "%s(config-bssgp)# ",
Harald Welte4e5721d2010-05-17 23:41:43 +020062 1,
63};
64
65static int config_write_bssgp(struct vty *vty)
66{
67 vty_out(vty, "bssgp%s", VTY_NEWLINE);
68
69 return CMD_SUCCESS;
70}
71
72DEFUN(cfg_bssgp, cfg_bssgp_cmd,
73 "bssgp",
74 "Configure the GPRS BSS Gateway Protocol")
75{
Harald Welte4f5883b2012-06-16 16:54:06 +080076 vty->node = L_BSSGP_NODE;
Harald Welte4e5721d2010-05-17 23:41:43 +020077 return CMD_SUCCESS;
78}
79
80static void dump_bvc(struct vty *vty, struct bssgp_bvc_ctx *bvc, int stats)
81{
Neels Hofmeyrc4fce142018-02-20 13:47:08 +010082 vty_out(vty, "NSEI %5u, BVCI %5u, RA-ID: %s, CID: %u, "
83 "STATE: %s%s", bvc->nsei, bvc->bvci, osmo_rai_name(&bvc->ra_id),
84 bvc->cell_id, bvc->state & BVC_S_BLOCKED ? "BLOCKED" : "UNBLOCKED", VTY_NEWLINE);
Harald Welte0823e1e2012-09-07 12:13:09 +020085
86 if (stats) {
87 struct bssgp_flow_control *fc = bvc->fc;
88
Harald Welte4e5721d2010-05-17 23:41:43 +020089 vty_out_rate_ctr_group(vty, " ", bvc->ctrg);
Harald Welte0823e1e2012-09-07 12:13:09 +020090
91 if (fc)
92 vty_out(vty, "FC-BVC(bucket_max: %uoct, leak_rate: "
93 "%uoct/s, cur_tokens: %uoct, max_q_d: %u, "
Jacob Erlbeck1bda4422015-04-29 15:00:29 +020094 "cur_q_d: %u)%s", fc->bucket_size_max,
Harald Welte0823e1e2012-09-07 12:13:09 +020095 fc->bucket_leak_rate, fc->bucket_counter,
Jacob Erlbeck1bda4422015-04-29 15:00:29 +020096 fc->max_queue_depth, fc->queue_depth,
97 VTY_NEWLINE);
Harald Welte0823e1e2012-09-07 12:13:09 +020098 }
Harald Welte4e5721d2010-05-17 23:41:43 +020099}
100
101static void dump_bssgp(struct vty *vty, int stats)
102{
103 struct bssgp_bvc_ctx *bvc;
104
105 llist_for_each_entry(bvc, &bssgp_bvc_ctxts, list) {
106 dump_bvc(vty, bvc, stats);
107 }
108}
109
Maxea507322016-03-31 21:40:26 +0200110DEFUN(bvc_reset, bvc_reset_cmd,
Maxb9bb0b02016-04-07 11:01:52 +0200111 "bssgp bvc nsei <0-65535> bvci <0-65535> reset",
112 "Initiate BVC RESET procedure for a given NSEI and BVCI\n"
113 "Filter based on BSSGP Virtual Connection\n"
114 "NSEI of the BVC to be filtered\n"
115 "Network Service Entity Identifier (NSEI)\n"
116 "BVCI of the BVC to be filtered\n"
117 "BSSGP Virtual Connection Identifier (BVCI)\n"
118 "Perform reset procedure\n")
Maxea507322016-03-31 21:40:26 +0200119{
120 int r;
121 uint16_t nsei = atoi(argv[0]), bvci = atoi(argv[1]);
122 struct bssgp_bvc_ctx *bvc = btsctx_by_bvci_nsei(bvci, nsei);
123 if (!bvc) {
124 vty_out(vty, "No BVC for NSEI %d BVCI %d%s", nsei, bvci,
125 VTY_NEWLINE);
126 return CMD_WARNING;
127 }
128 r = bssgp_tx_bvc_reset(bvc, bvci, BSSGP_CAUSE_OML_INTERV);
129 vty_out(vty, "Sent BVC RESET for NSEI %d BVCI %d: %d%s", nsei, bvci, r,
130 VTY_NEWLINE);
131 return CMD_SUCCESS;
132}
133
Harald Welte4e5721d2010-05-17 23:41:43 +0200134#define BSSGP_STR "Show information about the BSSGP protocol\n"
135
136DEFUN(show_bssgp, show_bssgp_cmd, "show bssgp",
137 SHOW_STR BSSGP_STR)
138{
139 dump_bssgp(vty, 0);
140 return CMD_SUCCESS;
141}
142
143DEFUN(show_bssgp_stats, show_bssgp_stats_cmd, "show bssgp stats",
144 SHOW_STR BSSGP_STR
145 "Include statistics\n")
146{
147 dump_bssgp(vty, 1);
148 return CMD_SUCCESS;
149}
150
151DEFUN(show_bvc, show_bvc_cmd, "show bssgp nsei <0-65535> [stats]",
152 SHOW_STR BSSGP_STR
Harald Welte781b3e62010-06-10 00:20:12 +0200153 "Show all BVCs on one NSE\n"
Harald Welte4e5721d2010-05-17 23:41:43 +0200154 "The NSEI\n" "Include Statistics\n")
155{
156 struct bssgp_bvc_ctx *bvc;
Jacob Erlbeck0673b702014-11-10 08:27:15 +0100157 uint16_t nsei = atoi(argv[0]);
Harald Welte4e5721d2010-05-17 23:41:43 +0200158 int show_stats = 0;
159
160 if (argc >= 2)
161 show_stats = 1;
162
163 llist_for_each_entry(bvc, &bssgp_bvc_ctxts, list) {
164 if (bvc->nsei != nsei)
165 continue;
166 dump_bvc(vty, bvc, show_stats);
167 }
168
169 return CMD_SUCCESS;
170}
171
172DEFUN(logging_fltr_bvc,
173 logging_fltr_bvc_cmd,
174 "logging filter bvc nsei <0-65535> bvci <0-65535>",
175 LOGGING_STR FILTER_STR
176 "Filter based on BSSGP Virtual Connection\n"
177 "NSEI of the BVC to be filtered\n"
178 "Network Service Entity Identifier (NSEI)\n"
179 "BVCI of the BVC to be filtered\n"
180 "BSSGP Virtual Connection Identifier (BVCI)\n")
181{
Pau Espin Pedrold12f6982019-09-17 18:38:58 +0200182 struct log_target *tgt;
Harald Welte4e5721d2010-05-17 23:41:43 +0200183 struct bssgp_bvc_ctx *bvc;
184 uint16_t nsei = atoi(argv[0]);
185 uint16_t bvci = atoi(argv[1]);
186
Pau Espin Pedrold12f6982019-09-17 18:38:58 +0200187 log_tgt_mutex_lock();
188 tgt = osmo_log_vty2tgt(vty);
189 if (!tgt) {
190 log_tgt_mutex_unlock();
Harald Welte4e5721d2010-05-17 23:41:43 +0200191 return CMD_WARNING;
Pau Espin Pedrold12f6982019-09-17 18:38:58 +0200192 }
Harald Welte4e5721d2010-05-17 23:41:43 +0200193
194 bvc = btsctx_by_bvci_nsei(bvci, nsei);
195 if (!bvc) {
196 vty_out(vty, "No BVC by that identifier%s", VTY_NEWLINE);
Pau Espin Pedrold12f6982019-09-17 18:38:58 +0200197 log_tgt_mutex_unlock();
Harald Welte4e5721d2010-05-17 23:41:43 +0200198 return CMD_WARNING;
199 }
200
Harald Welte43ae94e2011-02-18 21:10:05 +0100201 log_set_bvc_filter(tgt, bvc);
Pau Espin Pedrold12f6982019-09-17 18:38:58 +0200202 log_tgt_mutex_unlock();
Harald Welte4e5721d2010-05-17 23:41:43 +0200203 return CMD_SUCCESS;
204}
205
Harald Weltede4599c2012-06-17 13:04:02 +0800206int bssgp_vty_init(void)
Harald Welte4e5721d2010-05-17 23:41:43 +0200207{
Vadim Yanitskiy8e7c4962020-10-04 15:37:31 +0700208 install_lib_element_ve(&show_bssgp_cmd);
209 install_lib_element_ve(&show_bssgp_stats_cmd);
210 install_lib_element_ve(&show_bvc_cmd);
211 install_lib_element_ve(&logging_fltr_bvc_cmd);
212 install_lib_element_ve(&bvc_reset_cmd);
Harald Welte4e5721d2010-05-17 23:41:43 +0200213
Vadim Yanitskiy8e7c4962020-10-04 15:37:31 +0700214 install_lib_element(CFG_LOG_NODE, &logging_fltr_bvc_cmd);
Harald Welte43ae94e2011-02-18 21:10:05 +0100215
Vadim Yanitskiy8e7c4962020-10-04 15:37:31 +0700216 install_lib_element(CONFIG_NODE, &cfg_bssgp_cmd);
Harald Welte4e5721d2010-05-17 23:41:43 +0200217 install_node(&bssgp_node, config_write_bssgp);
Harald Welte4e5721d2010-05-17 23:41:43 +0200218
219 return 0;
220}