blob: e6d007aff0d0f865fad9c19e70d4de8e9b98a569 [file] [log] [blame]
/*
<:copyright-BRCM:2016:DUAL/GPL:standard
Broadcom Proprietary and Confidential.(c) 2016 Broadcom
All Rights Reserved
Unless you and Broadcom execute a separate written software license
agreement governing use of this software, this software is licensed
to you under the terms of the GNU General Public License version 2
(the "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
with the following added to such license:
As a special exception, the copyright holders of this software give
you permission to link this software with independent modules, and
to copy and distribute the resulting executable under terms of your
choice, provided that you also meet, for each linked independent
module, the terms and conditions of the license of that module.
An independent module is a module which is not derived from this
software. The special exception does not apply to any modifications
of the software.
Not withstanding the above, under no circumstances may you combine
this software in any way with any other Broadcom software provided
under a license other than the GPL, without Broadcom's express prior
written consent.
:>
*/
#include <bcmos_system.h>
#include <bcmcli.h>
#include <bcmtr_interface.h>
#include <bcmtr_internal.h>
#include <bcmtr_transport_cli.h>
#include <bcm_api_cli_helpers.h>
#ifdef BCMTR_PERFTEST
#include <test/bcmtr_perftest.h>
#endif
#ifdef BCMTR_PLUGIN_TASK_FORWARDER
extern uint32_t raw_tx_drop_count;
#endif
/*
* CLI support
*/
static bcmcli_entry *trcli_dir;
#ifdef BCMTR_UDP_SUPPORT
/* Display/set host IP+port
BCMCLI_MAKE_PARM("ip_addr", "IP address", BCMCLI_PARM_IP, BCMCLI_PARM_FLAG_OPTIONAL),
BCMCLI_MAKE_PARM_RANGE("udp_port", "UDP port", BCMCLI_PARM_NUMBER, BCMCLI_PARM_FLAG_OPTIONAL,
*/
static bcmos_errno _bcmtr_cli_host_udp(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t nparms)
{
if (!nparms)
{
bcmcli_session_print(session, "Host Address:port = %d.%d.%d.%d:%d\n",
(bcmtr_host_ip >> 24) & 0xff, (bcmtr_host_ip >> 16) & 0xff,
(bcmtr_host_ip >> 8) & 0xff, bcmtr_host_ip & 0xff, bcmtr_host_udp_port);
}
else
{
if (bcmcli_parm_is_set(session, &parm[0]))
{
bcmtr_host_ip = parm[0].value.number;
}
if (bcmcli_parm_is_set(session, &parm[1]))
{
bcmtr_host_udp_port = parm[1].value.number;
}
}
return BCM_ERR_OK;
}
/* Display/Set OLT IP+port
BCMCLI_MAKE_PARM_RANGE("device", "Device index", BCMCLI_PARM_DECIMAL, 0,
BCMCLI_MAKE_PARM("ip_addr", "IP address", BCMCLI_PARM_IP, BCMCLI_PARM_FLAG_OPTIONAL),
BCMCLI_MAKE_PARM_RANGE("udp_port", "UDP port", BCMCLI_PARM_NUMBER, BCMCLI_PARM_FLAG_OPTIONAL,
*/
static bcmos_errno _bcmtr_cli_olt_udp(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t nparms)
{
bcmolt_devid device = (bcmolt_devid)parm[0].value.number;
if (nparms == 1)
{
bcmcli_session_print(session, "OLT[%d] Address:port = %d.%d.%d.%d:%d\n",
device,
(bcmtr_olt_ip[device] >> 24) & 0xff, (bcmtr_olt_ip[device] >> 16) & 0xff,
(bcmtr_olt_ip[device] >> 8) & 0xff, bcmtr_olt_ip[device] & 0xff,
bcmtr_olt_udp_port[device]);
}
else
{
if (bcmcli_parm_is_set(session, &parm[1]))
{
bcmtr_olt_ip[device] = parm[1].value.number;
}
if (bcmcli_parm_is_set(session, &parm[2]))
{
bcmtr_olt_udp_port[device] = parm[2].value.number;
}
}
return BCM_ERR_OK;
}
#endif /* #ifdef BCMTR_UDP_SUPPORT */
/* Connect
BCMCLI_MAKE_PARM_RANGE("device", "Device index", BCMCLI_PARM_DECIMAL, 0,
*/
static bcmos_errno _bcmtr_cli_connect(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t nparms)
{
bcmolt_devid device = (bcmolt_devid)parm[0].value.number;
return bcmtr_connect(device);
}
/* Disconnect
BCMCLI_MAKE_PARM_RANGE("device", "Device index", BCMCLI_PARM_DECIMAL, 0,
*/
static bcmos_errno _bcmtr_cli_disconnect(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t nparms)
{
bcmolt_devid device = (bcmolt_devid)parm[0].value.number;
return bcmtr_disconnect(device);
}
/* Reconnect
BCMCLI_MAKE_PARM_RANGE("device", "Device index", BCMCLI_PARM_DECIMAL, 0,
*/
static bcmos_errno _bcmtr_cli_reconnect(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t nparms)
{
bcmolt_devid device = (bcmolt_devid)parm[0].value.number;
return bcmtr_driver_reconnect(device);
}
/* Stat
BCMCLI_MAKE_PARM_RANGE("device", "Device index", BCMCLI_PARM_DECIMAL, 0,
*/
static bcmos_errno _bcmtr_cli_stat(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t nparms)
{
bcmolt_devid device = (bcmolt_devid)parm[0].value.number;
bcmtr_stat stat;
bcmos_errno err;
#ifdef BCMTR_PLUGIN_TASK_FORWARDER
static uint32_t prev_raw_tx_drop_count;
uint32_t new_raw_tx_drop_count = raw_tx_drop_count;
#endif
err = bcmtr_stat_get(device, &stat);
if (err)
return err;
bcmcli_session_print(session, "%-24s : %d\n", "msg_sent", stat.msg_sent);
bcmcli_session_print(session, "%-24s : %d\n", "msg_resp_received", stat.msg_resp_received);
bcmcli_session_print(session, "%-24s : %d\n", "msg_req_auto_received", stat.msg_req_auto_received);
bcmcli_session_print(session, "%-24s : %d\n", "msg_req_timeout", stat.msg_req_timeout);
bcmcli_session_print(session, "%-24s : %d\n", "msg_reass_timeout", stat.msg_reass_timeout);
bcmcli_session_print(session, "%-24s : %d\n", "msg_no_req", stat.msg_no_req);
bcmcli_session_print(session, "%-24s : %d\n", "msg_no_mem", stat.msg_no_mem);
bcmcli_session_print(session, "%-24s : %d\n", "msg_comm_err", stat.msg_comm_err);
bcmcli_session_print(session, "%-24s : %d\n", "msg_ready_timeout", stat.msg_ready_timeout);
bcmcli_session_print(session, "%-24s : %d\n", "msg_too_many_req", stat.msg_too_many_req);
bcmcli_session_print(session, "%-24s : %d\n", "msg_too_many_auto", stat.msg_too_many_auto);
bcmcli_session_print(session, "%-24s : %d\n", "frag_received", stat.frag_received);
bcmcli_session_print(session, "%-24s : %d\n", "frag_invalid", stat.frag_invalid);
bcmcli_session_print(session, "%-24s : %d\n", "unpack_errors", stat.unpack_errors);
bcmcli_session_print(session, "%-24s : %d\n", "pack_errors", stat.pack_errors);
bcmcli_session_print(session, "%-24s : %d\n", "no_rx_handler", stat.no_rx_handler);
bcmcli_session_print(session, "%-24s : %d\n", "not_connected", stat.not_connected);
#ifdef BCMTR_PLUGIN_TASK_FORWARDER
bcmcli_session_print(session, "%-24s : %d\n", "raw_tx_drop", new_raw_tx_drop_count - prev_raw_tx_drop_count);
prev_raw_tx_drop_count = new_raw_tx_drop_count;
#endif
return BCM_ERR_OK;
}
/* Register
BCMCLI_MAKE_PARM_RANGE("device", "Device index", BCMCLI_PARM_DECIMAL, 0,
*/
static bcmos_errno _bcmtr_cli_register_info(bcmcli_session *session, const bcmcli_cmd_parm parm[], uint16_t nparms)
{
bcmolt_devid device = (bcmolt_devid)parm[0].value.number;
bcmtr_handler_parm p =
{
.instance = (uint8_t)parm[1].value.number,
.group = (bcmolt_mgt_group)parm[2].value.number,
};
if (p.instance >= BCMTR_MAX_INSTANCES)
{
return BCM_ERR_PARM;
}
for (p.object = BCMOLT_OBJ_ID_DEVICE; p.object < BCMOLT_OBJ_ID__NUM_OF; p.object++)
{
bcmolt_group_id group_id;
const char *obj_name, *obj_descr;
const char *sub_name, *sub_descr;
if (api_cli_object_name(p.object, &obj_name, &obj_descr) != BCM_ERR_OK)
continue;
for (p.subgroup = 0; bcmtr_msg_handler_register_get(device, &p) == BCM_ERR_OK; p.subgroup++)
{
bcmolt_group_id_combine(p.object, p.group, p.subgroup, &group_id);
api_cli_object_subgroup_name(p.object, p.group, p.subgroup, &sub_name, &sub_descr);
bcmcli_session_print(session, "%s - %s : msg_id=%u ", obj_name, sub_name, group_id);
if (p.app_cb)
{
bcmcli_session_print(session, "module:%d func:%p\n", p.module, p.app_cb);
}
else
{
bcmcli_session_print(session, "NONE\n");
}
}
}
return BCM_ERR_OK;
}
bcmos_errno bcmtr_cli_init(void)
{
if ((trcli_dir=bcmcli_dir_find(NULL, "transport")) != NULL)
return BCM_ERR_ALREADY;
trcli_dir = bcmcli_dir_add(NULL, "transport", "Maple Transport", BCMCLI_ACCESS_GUEST, NULL);
if (!trcli_dir)
{
printf("Can't create transport directory\n");
return BCM_ERR_INTERNAL;
}
#ifdef BCMTR_UDP_SUPPORT
BCMCLI_MAKE_CMD(trcli_dir, "host_udp", "Host IP and UDP port parameters", _bcmtr_cli_host_udp,
BCMCLI_MAKE_PARM("ip_addr", "IP address", BCMCLI_PARM_IP, BCMCLI_PARM_FLAG_OPTIONAL),
BCMCLI_MAKE_PARM_RANGE("udp_port", "UDP port", BCMCLI_PARM_NUMBER, BCMCLI_PARM_FLAG_OPTIONAL,
0, 0xffff));
BCMCLI_MAKE_CMD(trcli_dir, "olt_udp", "OLT IP and UDP port parameters", _bcmtr_cli_olt_udp,
BCMCLI_MAKE_PARM_RANGE("device", "Device index", BCMCLI_PARM_DECIMAL, 0,
0, BCMTR_MAX_OLTS-1),
BCMCLI_MAKE_PARM("ip_addr", "IP address", BCMCLI_PARM_IP, BCMCLI_PARM_FLAG_OPTIONAL),
BCMCLI_MAKE_PARM_RANGE("udp_port", "UDP port", BCMCLI_PARM_NUMBER, BCMCLI_PARM_FLAG_OPTIONAL,
0, 0xffff));
#endif
BCMCLI_MAKE_CMD(trcli_dir, "connect", "Connect", _bcmtr_cli_connect,
BCMCLI_MAKE_PARM_RANGE("device", "Device index", BCMCLI_PARM_DECIMAL, 0,
0, BCMTR_MAX_OLTS-1));
BCMCLI_MAKE_CMD(trcli_dir, "disconnect", "Disconnect", _bcmtr_cli_disconnect,
BCMCLI_MAKE_PARM_RANGE("device", "Device index", BCMCLI_PARM_DECIMAL, 0,
0, BCMTR_MAX_OLTS-1));
BCMCLI_MAKE_CMD(trcli_dir, "reconnect", "Reconnect", _bcmtr_cli_reconnect,
BCMCLI_MAKE_PARM_RANGE("device", "Device index", BCMCLI_PARM_DECIMAL, 0,
0, BCMTR_MAX_OLTS-1));
BCMCLI_MAKE_CMD(trcli_dir, "stat", "Transport statistics", _bcmtr_cli_stat,
BCMCLI_MAKE_PARM_RANGE("device", "Device index", BCMCLI_PARM_DECIMAL, 0,
0, BCMTR_MAX_OLTS-1));
{
static bcmcli_enum_val groups[] =
{
#ifdef BCM_SUBSYSTEM_HOST
{ .name = "auto", .val = BCMOLT_MGT_GROUP_CFG },
{ .name = "proxy_rx", .val = BCMOLT_MGT_GROUP_PROXY_RX },
#else
{ .name = "cfg", .val = BCMOLT_MGT_GROUP_CFG },
{ .name = "stat", .val = BCMOLT_MGT_GROUP_STAT },
{ .name = "stat_cfg", .val = BCMOLT_MGT_GROUP_STAT_CFG },
{ .name = "oper", .val = BCMOLT_MGT_GROUP_OPER },
{ .name = "auto_cfg", .val = BCMOLT_MGT_GROUP_AUTO_CFG },
{ .name = "proxy", .val = BCMOLT_MGT_GROUP_PROXY },
#endif
{ .name = NULL }
};
BCMCLI_MAKE_CMD(trcli_dir, "registration", "Transport RX registration info", _bcmtr_cli_register_info,
BCMCLI_MAKE_PARM_RANGE("device", "Device index", BCMCLI_PARM_DECIMAL, 0,
0, BCMTR_MAX_OLTS-1),
BCMCLI_MAKE_PARM_RANGE("pon_ni", "PON NI", BCMCLI_PARM_DECIMAL, 0,
0, BCMTR_MAX_INSTANCES-1),
BCMCLI_MAKE_PARM_ENUM("group", "Management group", groups, 0) );
}
/* Performance testing directory */
#ifdef BCMTR_PERFTEST
bcmtr_test_init();
#endif
return BCM_ERR_OK;
}
void bcmtr_cli_exit(void)
{
if (trcli_dir)
{
bcmcli_token_destroy(trcli_dir);
trcli_dir = NULL;
}
}