blob: 256e8af7f2b6c9b7bb8076b7f5caa6aeadd1e63c [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
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 Welte73952e32012-06-16 14:59:56 +080043#include <openbsc/vty.h>
44#include <openbsc/gsm_data.h>
45#include <openbsc/debug.h>
46
47
Harald Welte4e5721d2010-05-17 23:41:43 +020048/* FIXME: this should go to some common file as it is copied
49 * in vty_interface.c of the BSC */
50static const struct value_string gprs_bssgp_timer_strs[] = {
51 { 0, NULL }
52};
53
54static struct cmd_node bssgp_node = {
55 BSSGP_NODE,
56 "%s(bssgp)#",
57 1,
58};
59
60static int config_write_bssgp(struct vty *vty)
61{
62 vty_out(vty, "bssgp%s", VTY_NEWLINE);
63
64 return CMD_SUCCESS;
65}
66
67DEFUN(cfg_bssgp, cfg_bssgp_cmd,
68 "bssgp",
69 "Configure the GPRS BSS Gateway Protocol")
70{
71 vty->node = BSSGP_NODE;
72 return CMD_SUCCESS;
73}
74
75static void dump_bvc(struct vty *vty, struct bssgp_bvc_ctx *bvc, int stats)
76{
77 vty_out(vty, "NSEI %5u, BVCI %5u, RA-ID: %u-%u-%u-%u, CID: %u, "
Harald Weltebf03d902010-05-18 12:00:55 +020078 "STATE: %s%s", bvc->nsei, bvc->bvci, bvc->ra_id.mcc,
Harald Welte4e5721d2010-05-17 23:41:43 +020079 bvc->ra_id.mnc, bvc->ra_id.lac, bvc->ra_id.rac, bvc->cell_id,
80 bvc->state & BVC_S_BLOCKED ? "BLOCKED" : "UNBLOCKED",
81 VTY_NEWLINE);
82 if (stats)
83 vty_out_rate_ctr_group(vty, " ", bvc->ctrg);
84}
85
86static void dump_bssgp(struct vty *vty, int stats)
87{
88 struct bssgp_bvc_ctx *bvc;
89
90 llist_for_each_entry(bvc, &bssgp_bvc_ctxts, list) {
91 dump_bvc(vty, bvc, stats);
92 }
93}
94
95#define BSSGP_STR "Show information about the BSSGP protocol\n"
96
97DEFUN(show_bssgp, show_bssgp_cmd, "show bssgp",
98 SHOW_STR BSSGP_STR)
99{
100 dump_bssgp(vty, 0);
101 return CMD_SUCCESS;
102}
103
104DEFUN(show_bssgp_stats, show_bssgp_stats_cmd, "show bssgp stats",
105 SHOW_STR BSSGP_STR
106 "Include statistics\n")
107{
108 dump_bssgp(vty, 1);
109 return CMD_SUCCESS;
110}
111
112DEFUN(show_bvc, show_bvc_cmd, "show bssgp nsei <0-65535> [stats]",
113 SHOW_STR BSSGP_STR
Harald Welte781b3e62010-06-10 00:20:12 +0200114 "Show all BVCs on one NSE\n"
Harald Welte4e5721d2010-05-17 23:41:43 +0200115 "The NSEI\n" "Include Statistics\n")
116{
117 struct bssgp_bvc_ctx *bvc;
118 uint16_t nsei = atoi(argv[1]);
119 int show_stats = 0;
120
121 if (argc >= 2)
122 show_stats = 1;
123
124 llist_for_each_entry(bvc, &bssgp_bvc_ctxts, list) {
125 if (bvc->nsei != nsei)
126 continue;
127 dump_bvc(vty, bvc, show_stats);
128 }
129
130 return CMD_SUCCESS;
131}
132
133DEFUN(logging_fltr_bvc,
134 logging_fltr_bvc_cmd,
135 "logging filter bvc nsei <0-65535> bvci <0-65535>",
136 LOGGING_STR FILTER_STR
137 "Filter based on BSSGP Virtual Connection\n"
138 "NSEI of the BVC to be filtered\n"
139 "Network Service Entity Identifier (NSEI)\n"
140 "BVCI of the BVC to be filtered\n"
141 "BSSGP Virtual Connection Identifier (BVCI)\n")
142{
Harald Welte43ae94e2011-02-18 21:10:05 +0100143 struct log_target *tgt = osmo_log_vty2tgt(vty);
Harald Welte4e5721d2010-05-17 23:41:43 +0200144 struct bssgp_bvc_ctx *bvc;
145 uint16_t nsei = atoi(argv[0]);
146 uint16_t bvci = atoi(argv[1]);
147
Harald Welte43ae94e2011-02-18 21:10:05 +0100148 if (!tgt)
Harald Welte4e5721d2010-05-17 23:41:43 +0200149 return CMD_WARNING;
Harald Welte4e5721d2010-05-17 23:41:43 +0200150
151 bvc = btsctx_by_bvci_nsei(bvci, nsei);
152 if (!bvc) {
153 vty_out(vty, "No BVC by that identifier%s", VTY_NEWLINE);
154 return CMD_WARNING;
155 }
156
Harald Welte43ae94e2011-02-18 21:10:05 +0100157 log_set_bvc_filter(tgt, bvc);
Harald Welte4e5721d2010-05-17 23:41:43 +0200158 return CMD_SUCCESS;
159}
160
161int gprs_bssgp_vty_init(void)
162{
163 install_element_ve(&show_bssgp_cmd);
164 install_element_ve(&show_bssgp_stats_cmd);
165 install_element_ve(&show_bvc_cmd);
166 install_element_ve(&logging_fltr_bvc_cmd);
167
Harald Welte43ae94e2011-02-18 21:10:05 +0100168 install_element(CFG_LOG_NODE, &logging_fltr_bvc_cmd);
169
Harald Welte4e5721d2010-05-17 23:41:43 +0200170 install_element(CONFIG_NODE, &cfg_bssgp_cmd);
171 install_node(&bssgp_node, config_write_bssgp);
172 install_default(BSSGP_NODE);
173 install_element(BSSGP_NODE, &ournode_exit_cmd);
174 install_element(BSSGP_NODE, &ournode_end_cmd);
175 //install_element(BSSGP_NODE, &cfg_bssgp_timer_cmd);
176
177 return 0;
178}