blob: 080867b5532d6e41cfd7a418cf05b7162a0f5bcd [file] [log] [blame]
Harald Welte4e5721d2010-05-17 23:41:43 +02001/* VTY interface for our GPRS BSS Gateway Protocol (BSSGP) implementation */
2
3/* (C) 2010 by Harald Welte <laforge@gnumonks.org>
4 *
5 * All Rights Reserved
6 *
7 * This program is free software; you can redistribute it and/or modify
Harald Welte7fa89c22014-10-26 20:33:09 +01008 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
Harald Welte4e5721d2010-05-17 23:41:43 +020010 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Harald Welte7fa89c22014-10-26 20:33:09 +010015 * GNU General Public License for more details.
Harald Welte4e5721d2010-05-17 23:41:43 +020016 *
Harald Welte7fa89c22014-10-26 20:33:09 +010017 * You should have received a copy of the GNU General Public License
Harald Weltee4cbb3f2011-01-01 15:25:50 +010018 * along with this program. If not, see <http://www.gnu.org/licenses/>.
Harald Welte4e5721d2010-05-17 23:41:43 +020019 *
20 */
21
22#include <stdlib.h>
23#include <unistd.h>
24#include <errno.h>
25#include <stdint.h>
26
27#include <arpa/inet.h>
28
Pablo Neira Ayusoff663232011-03-22 16:47:59 +010029#include <osmocom/core/msgb.h>
30#include <osmocom/gsm/tlv.h>
31#include <osmocom/core/talloc.h>
32#include <osmocom/core/select.h>
33#include <osmocom/core/rate_ctr.h>
Harald Welte73952e32012-06-16 14:59:56 +080034#include <osmocom/gprs/gprs_ns.h>
35#include <osmocom/gprs/gprs_bssgp.h>
Harald Welte4e5721d2010-05-17 23:41:43 +020036
Harald Welteac1a7152010-05-19 19:45:32 +020037#include <osmocom/vty/vty.h>
38#include <osmocom/vty/command.h>
39#include <osmocom/vty/logging.h>
40#include <osmocom/vty/telnet_interface.h>
Pablo Neira Ayuso167281e2011-03-28 19:35:00 +020041#include <osmocom/vty/misc.h>
Harald Welte4e5721d2010-05-17 23:41:43 +020042
Harald Welte4f5883b2012-06-16 16:54:06 +080043#include "common_vty.h"
Harald Welte73952e32012-06-16 14:59:56 +080044
Harald Welte4e5721d2010-05-17 23:41:43 +020045/* FIXME: this should go to some common file as it is copied
46 * in vty_interface.c of the BSC */
47static const struct value_string gprs_bssgp_timer_strs[] = {
48 { 0, NULL }
49};
50
Harald Weltef5430362012-06-17 12:25:53 +080051static void log_set_bvc_filter(struct log_target *target,
52 struct bssgp_bvc_ctx *bctx)
53{
54 if (bctx) {
55 target->filter_map |= (1 << FLT_BVC);
56 target->filter_data[FLT_BVC] = bctx;
57 } else if (target->filter_data[FLT_NSVC]) {
58 target->filter_map = ~(1 << FLT_BVC);
59 target->filter_data[FLT_BVC] = NULL;
60 }
61}
62
Harald Welte4e5721d2010-05-17 23:41:43 +020063static struct cmd_node bssgp_node = {
Harald Welte4f5883b2012-06-16 16:54:06 +080064 L_BSSGP_NODE,
Harald Welte4e5721d2010-05-17 23:41:43 +020065 "%s(bssgp)#",
66 1,
67};
68
69static int config_write_bssgp(struct vty *vty)
70{
71 vty_out(vty, "bssgp%s", VTY_NEWLINE);
72
73 return CMD_SUCCESS;
74}
75
76DEFUN(cfg_bssgp, cfg_bssgp_cmd,
77 "bssgp",
78 "Configure the GPRS BSS Gateway Protocol")
79{
Harald Welte4f5883b2012-06-16 16:54:06 +080080 vty->node = L_BSSGP_NODE;
Harald Welte4e5721d2010-05-17 23:41:43 +020081 return CMD_SUCCESS;
82}
83
84static void dump_bvc(struct vty *vty, struct bssgp_bvc_ctx *bvc, int stats)
85{
86 vty_out(vty, "NSEI %5u, BVCI %5u, RA-ID: %u-%u-%u-%u, CID: %u, "
Harald Weltebf03d902010-05-18 12:00:55 +020087 "STATE: %s%s", bvc->nsei, bvc->bvci, bvc->ra_id.mcc,
Harald Welte4e5721d2010-05-17 23:41:43 +020088 bvc->ra_id.mnc, bvc->ra_id.lac, bvc->ra_id.rac, bvc->cell_id,
89 bvc->state & BVC_S_BLOCKED ? "BLOCKED" : "UNBLOCKED",
90 VTY_NEWLINE);
Harald Welte0823e1e2012-09-07 12:13:09 +020091
92 if (stats) {
93 struct bssgp_flow_control *fc = bvc->fc;
94
Harald Welte4e5721d2010-05-17 23:41:43 +020095 vty_out_rate_ctr_group(vty, " ", bvc->ctrg);
Harald Welte0823e1e2012-09-07 12:13:09 +020096
97 if (fc)
98 vty_out(vty, "FC-BVC(bucket_max: %uoct, leak_rate: "
99 "%uoct/s, cur_tokens: %uoct, max_q_d: %u, "
Jacob Erlbeck1bda4422015-04-29 15:00:29 +0200100 "cur_q_d: %u)%s", fc->bucket_size_max,
Harald Welte0823e1e2012-09-07 12:13:09 +0200101 fc->bucket_leak_rate, fc->bucket_counter,
Jacob Erlbeck1bda4422015-04-29 15:00:29 +0200102 fc->max_queue_depth, fc->queue_depth,
103 VTY_NEWLINE);
Harald Welte0823e1e2012-09-07 12:13:09 +0200104 }
Harald Welte4e5721d2010-05-17 23:41:43 +0200105}
106
107static void dump_bssgp(struct vty *vty, int stats)
108{
109 struct bssgp_bvc_ctx *bvc;
110
111 llist_for_each_entry(bvc, &bssgp_bvc_ctxts, list) {
112 dump_bvc(vty, bvc, stats);
113 }
114}
115
116#define BSSGP_STR "Show information about the BSSGP protocol\n"
117
118DEFUN(show_bssgp, show_bssgp_cmd, "show bssgp",
119 SHOW_STR BSSGP_STR)
120{
121 dump_bssgp(vty, 0);
122 return CMD_SUCCESS;
123}
124
125DEFUN(show_bssgp_stats, show_bssgp_stats_cmd, "show bssgp stats",
126 SHOW_STR BSSGP_STR
127 "Include statistics\n")
128{
129 dump_bssgp(vty, 1);
130 return CMD_SUCCESS;
131}
132
133DEFUN(show_bvc, show_bvc_cmd, "show bssgp nsei <0-65535> [stats]",
134 SHOW_STR BSSGP_STR
Harald Welte781b3e62010-06-10 00:20:12 +0200135 "Show all BVCs on one NSE\n"
Harald Welte4e5721d2010-05-17 23:41:43 +0200136 "The NSEI\n" "Include Statistics\n")
137{
138 struct bssgp_bvc_ctx *bvc;
Jacob Erlbeck0673b702014-11-10 08:27:15 +0100139 uint16_t nsei = atoi(argv[0]);
Harald Welte4e5721d2010-05-17 23:41:43 +0200140 int show_stats = 0;
141
142 if (argc >= 2)
143 show_stats = 1;
144
145 llist_for_each_entry(bvc, &bssgp_bvc_ctxts, list) {
146 if (bvc->nsei != nsei)
147 continue;
148 dump_bvc(vty, bvc, show_stats);
149 }
150
151 return CMD_SUCCESS;
152}
153
154DEFUN(logging_fltr_bvc,
155 logging_fltr_bvc_cmd,
156 "logging filter bvc nsei <0-65535> bvci <0-65535>",
157 LOGGING_STR FILTER_STR
158 "Filter based on BSSGP Virtual Connection\n"
159 "NSEI of the BVC to be filtered\n"
160 "Network Service Entity Identifier (NSEI)\n"
161 "BVCI of the BVC to be filtered\n"
162 "BSSGP Virtual Connection Identifier (BVCI)\n")
163{
Harald Welte43ae94e2011-02-18 21:10:05 +0100164 struct log_target *tgt = osmo_log_vty2tgt(vty);
Harald Welte4e5721d2010-05-17 23:41:43 +0200165 struct bssgp_bvc_ctx *bvc;
166 uint16_t nsei = atoi(argv[0]);
167 uint16_t bvci = atoi(argv[1]);
168
Harald Welte43ae94e2011-02-18 21:10:05 +0100169 if (!tgt)
Harald Welte4e5721d2010-05-17 23:41:43 +0200170 return CMD_WARNING;
Harald Welte4e5721d2010-05-17 23:41:43 +0200171
172 bvc = btsctx_by_bvci_nsei(bvci, nsei);
173 if (!bvc) {
174 vty_out(vty, "No BVC by that identifier%s", VTY_NEWLINE);
175 return CMD_WARNING;
176 }
177
Harald Welte43ae94e2011-02-18 21:10:05 +0100178 log_set_bvc_filter(tgt, bvc);
Harald Welte4e5721d2010-05-17 23:41:43 +0200179 return CMD_SUCCESS;
180}
181
Harald Weltede4599c2012-06-17 13:04:02 +0800182int bssgp_vty_init(void)
Harald Welte4e5721d2010-05-17 23:41:43 +0200183{
184 install_element_ve(&show_bssgp_cmd);
185 install_element_ve(&show_bssgp_stats_cmd);
186 install_element_ve(&show_bvc_cmd);
187 install_element_ve(&logging_fltr_bvc_cmd);
188
Harald Welte43ae94e2011-02-18 21:10:05 +0100189 install_element(CFG_LOG_NODE, &logging_fltr_bvc_cmd);
190
Harald Welte4e5721d2010-05-17 23:41:43 +0200191 install_element(CONFIG_NODE, &cfg_bssgp_cmd);
192 install_node(&bssgp_node, config_write_bssgp);
Harald Welte4f5883b2012-06-16 16:54:06 +0800193 install_default(L_BSSGP_NODE);
194 install_element(L_BSSGP_NODE, &libgb_exit_cmd);
195 install_element(L_BSSGP_NODE, &libgb_end_cmd);
196 //install_element(L_BSSGP_NODE, &cfg_bssgp_timer_cmd);
Harald Welte4e5721d2010-05-17 23:41:43 +0200197
198 return 0;
199}