blob: 256e8af7f2b6c9b7bb8076b7f5caa6aeadd1e63c [file] [log] [blame]
Harald Welted9a55f62010-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 Welte9af6ddf2011-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 Welted9a55f62010-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 Welte9af6ddf2011-01-01 15:25:50 +010015 * GNU Affero General Public License for more details.
Harald Welted9a55f62010-05-17 23:41:43 +020016 *
Harald Welte9af6ddf2011-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 Welted9a55f62010-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 Ayuso136f4532011-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 Welteea34a4e2012-06-16 14:59:56 +080034#include <osmocom/gprs/gprs_ns.h>
35#include <osmocom/gprs/gprs_bssgp.h>
Harald Welted9a55f62010-05-17 23:41:43 +020036
Harald Welte4b037e42010-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 Ayuso6110a3f2011-03-28 19:35:00 +020041#include <osmocom/vty/misc.h>
Harald Welted9a55f62010-05-17 23:41:43 +020042
Harald Welteea34a4e2012-06-16 14:59:56 +080043#include <openbsc/vty.h>
44#include <openbsc/gsm_data.h>
45#include <openbsc/debug.h>
46
47
Harald Welted9a55f62010-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 Welte803bd5c2010-05-18 12:00:55 +020078 "STATE: %s%s", bvc->nsei, bvc->bvci, bvc->ra_id.mcc,
Harald Welted9a55f62010-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 Welteefbdee92010-06-10 00:20:12 +0200114 "Show all BVCs on one NSE\n"
Harald Welted9a55f62010-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 Welte8dcebd32011-02-18 21:10:05 +0100143 struct log_target *tgt = osmo_log_vty2tgt(vty);
Harald Welted9a55f62010-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 Welte8dcebd32011-02-18 21:10:05 +0100148 if (!tgt)
Harald Welted9a55f62010-05-17 23:41:43 +0200149 return CMD_WARNING;
Harald Welted9a55f62010-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 Welte8dcebd32011-02-18 21:10:05 +0100157 log_set_bvc_filter(tgt, bvc);
Harald Welted9a55f62010-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 Welte8dcebd32011-02-18 21:10:05 +0100168 install_element(CFG_LOG_NODE, &logging_fltr_bvc_cmd);
169
Harald Welted9a55f62010-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}