blob: 6208ae3c17c5e767a0d66141deaa4795beaf4f63 [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 Weltee4cbb3f2011-01-01 15:25:50 +01008 * it under the terms of the GNU Affero General Public License as published by
9 * the Free Software Foundation; either version 3 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 Weltee4cbb3f2011-01-01 15:25:50 +010015 * GNU Affero General Public License for more details.
Harald Welte4e5721d2010-05-17 23:41:43 +020016 *
Harald Weltee4cbb3f2011-01-01 15:25:50 +010017 * You should have received a copy of the GNU Affero General Public License
18 * 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
29#include <openbsc/gsm_data.h>
30#include <osmocore/msgb.h>
31#include <osmocore/tlv.h>
32#include <osmocore/talloc.h>
33#include <osmocore/select.h>
34#include <osmocore/rate_ctr.h>
35#include <openbsc/debug.h>
36#include <openbsc/signal.h>
37#include <openbsc/gprs_ns.h>
38#include <openbsc/gprs_bssgp.h>
Harald Welte4e5721d2010-05-17 23:41:43 +020039#include <openbsc/vty.h>
40
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>
Harald Welte4e5721d2010-05-17 23:41:43 +020045
46/* FIXME: this should go to some common file as it is copied
47 * in vty_interface.c of the BSC */
48static const struct value_string gprs_bssgp_timer_strs[] = {
49 { 0, NULL }
50};
51
52static struct cmd_node bssgp_node = {
53 BSSGP_NODE,
54 "%s(bssgp)#",
55 1,
56};
57
58static int config_write_bssgp(struct vty *vty)
59{
60 vty_out(vty, "bssgp%s", VTY_NEWLINE);
61
62 return CMD_SUCCESS;
63}
64
65DEFUN(cfg_bssgp, cfg_bssgp_cmd,
66 "bssgp",
67 "Configure the GPRS BSS Gateway Protocol")
68{
69 vty->node = BSSGP_NODE;
70 return CMD_SUCCESS;
71}
72
73static void dump_bvc(struct vty *vty, struct bssgp_bvc_ctx *bvc, int stats)
74{
75 vty_out(vty, "NSEI %5u, BVCI %5u, RA-ID: %u-%u-%u-%u, CID: %u, "
Harald Weltebf03d902010-05-18 12:00:55 +020076 "STATE: %s%s", bvc->nsei, bvc->bvci, bvc->ra_id.mcc,
Harald Welte4e5721d2010-05-17 23:41:43 +020077 bvc->ra_id.mnc, bvc->ra_id.lac, bvc->ra_id.rac, bvc->cell_id,
78 bvc->state & BVC_S_BLOCKED ? "BLOCKED" : "UNBLOCKED",
79 VTY_NEWLINE);
80 if (stats)
81 vty_out_rate_ctr_group(vty, " ", bvc->ctrg);
82}
83
84static void dump_bssgp(struct vty *vty, int stats)
85{
86 struct bssgp_bvc_ctx *bvc;
87
88 llist_for_each_entry(bvc, &bssgp_bvc_ctxts, list) {
89 dump_bvc(vty, bvc, stats);
90 }
91}
92
93#define BSSGP_STR "Show information about the BSSGP protocol\n"
94
95DEFUN(show_bssgp, show_bssgp_cmd, "show bssgp",
96 SHOW_STR BSSGP_STR)
97{
98 dump_bssgp(vty, 0);
99 return CMD_SUCCESS;
100}
101
102DEFUN(show_bssgp_stats, show_bssgp_stats_cmd, "show bssgp stats",
103 SHOW_STR BSSGP_STR
104 "Include statistics\n")
105{
106 dump_bssgp(vty, 1);
107 return CMD_SUCCESS;
108}
109
110DEFUN(show_bvc, show_bvc_cmd, "show bssgp nsei <0-65535> [stats]",
111 SHOW_STR BSSGP_STR
Harald Welte781b3e62010-06-10 00:20:12 +0200112 "Show all BVCs on one NSE\n"
Harald Welte4e5721d2010-05-17 23:41:43 +0200113 "The NSEI\n" "Include Statistics\n")
114{
115 struct bssgp_bvc_ctx *bvc;
116 uint16_t nsei = atoi(argv[1]);
117 int show_stats = 0;
118
119 if (argc >= 2)
120 show_stats = 1;
121
122 llist_for_each_entry(bvc, &bssgp_bvc_ctxts, list) {
123 if (bvc->nsei != nsei)
124 continue;
125 dump_bvc(vty, bvc, show_stats);
126 }
127
128 return CMD_SUCCESS;
129}
130
131DEFUN(logging_fltr_bvc,
132 logging_fltr_bvc_cmd,
133 "logging filter bvc nsei <0-65535> bvci <0-65535>",
134 LOGGING_STR FILTER_STR
135 "Filter based on BSSGP Virtual Connection\n"
136 "NSEI of the BVC to be filtered\n"
137 "Network Service Entity Identifier (NSEI)\n"
138 "BVCI of the BVC to be filtered\n"
139 "BSSGP Virtual Connection Identifier (BVCI)\n")
140{
141 struct telnet_connection *conn;
142 struct bssgp_bvc_ctx *bvc;
143 uint16_t nsei = atoi(argv[0]);
144 uint16_t bvci = atoi(argv[1]);
145
146 conn = (struct telnet_connection *) vty->priv;
147 if (!conn->dbg) {
148 vty_out(vty, "Logging was not enabled.%s", VTY_NEWLINE);
149 return CMD_WARNING;
150 }
151
152 bvc = btsctx_by_bvci_nsei(bvci, nsei);
153 if (!bvc) {
154 vty_out(vty, "No BVC by that identifier%s", VTY_NEWLINE);
155 return CMD_WARNING;
156 }
157
158 log_set_bvc_filter(conn->dbg, bvc);
159 return CMD_SUCCESS;
160}
161
162int gprs_bssgp_vty_init(void)
163{
164 install_element_ve(&show_bssgp_cmd);
165 install_element_ve(&show_bssgp_stats_cmd);
166 install_element_ve(&show_bvc_cmd);
167 install_element_ve(&logging_fltr_bvc_cmd);
168
169 install_element(CONFIG_NODE, &cfg_bssgp_cmd);
170 install_node(&bssgp_node, config_write_bssgp);
171 install_default(BSSGP_NODE);
172 install_element(BSSGP_NODE, &ournode_exit_cmd);
173 install_element(BSSGP_NODE, &ournode_end_cmd);
174 //install_element(BSSGP_NODE, &cfg_bssgp_timer_cmd);
175
176 return 0;
177}