mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-05-29 06:29:40 +00:00
Merge pull request #1354 from chiragshah6/mdev1
ospfd: show comand for ospf packet stats
This commit is contained in:
commit
ccd05df5d3
@ -453,6 +453,15 @@ struct ospf_interface *ospf_if_lookup_recv_if(struct ospf *ospf,
|
|||||||
return match;
|
return match;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ospf_if_reset_stats(struct ospf_interface *oi)
|
||||||
|
{
|
||||||
|
oi->hello_in = oi->hello_out = 0;
|
||||||
|
oi->db_desc_in = oi->db_desc_out = 0;
|
||||||
|
oi->ls_req_in = oi->ls_req_out = 0;
|
||||||
|
oi->ls_upd_in = oi->ls_upd_out = 0;
|
||||||
|
oi->ls_ack_in = oi->ls_ack_out = 0;
|
||||||
|
}
|
||||||
|
|
||||||
void ospf_if_stream_set(struct ospf_interface *oi)
|
void ospf_if_stream_set(struct ospf_interface *oi)
|
||||||
{
|
{
|
||||||
/* set output fifo queue. */
|
/* set output fifo queue. */
|
||||||
@ -468,6 +477,9 @@ void ospf_if_stream_unset(struct ospf_interface *oi)
|
|||||||
ospf_fifo_free(oi->obuf);
|
ospf_fifo_free(oi->obuf);
|
||||||
oi->obuf = NULL;
|
oi->obuf = NULL;
|
||||||
|
|
||||||
|
/*reset protocol stats */
|
||||||
|
ospf_if_reset_stats(oi);
|
||||||
|
|
||||||
if (oi->on_write_q) {
|
if (oi->on_write_q) {
|
||||||
listnode_delete(ospf->oi_write_q, oi);
|
listnode_delete(ospf->oi_write_q, oi);
|
||||||
if (list_isempty(ospf->oi_write_q))
|
if (list_isempty(ospf->oi_write_q))
|
||||||
|
@ -825,6 +825,26 @@ static int ospf_write(struct thread *thread)
|
|||||||
"-----------------------------------------------------");
|
"-----------------------------------------------------");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case OSPF_MSG_HELLO:
|
||||||
|
oi->hello_out++;
|
||||||
|
break;
|
||||||
|
case OSPF_MSG_DB_DESC:
|
||||||
|
oi->db_desc_out++;
|
||||||
|
break;
|
||||||
|
case OSPF_MSG_LS_REQ:
|
||||||
|
oi->ls_req_out++;
|
||||||
|
break;
|
||||||
|
case OSPF_MSG_LS_UPD:
|
||||||
|
oi->ls_upd_out++;
|
||||||
|
break;
|
||||||
|
case OSPF_MSG_LS_ACK:
|
||||||
|
oi->ls_ack_out++;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/* Now delete packet from queue. */
|
/* Now delete packet from queue. */
|
||||||
ospf_packet_delete(oi);
|
ospf_packet_delete(oi);
|
||||||
|
|
||||||
|
215
ospfd/ospf_vty.c
215
ospfd/ospf_vty.c
@ -3666,6 +3666,154 @@ static int show_ip_ospf_interface_common(struct vty *vty, struct ospf *ospf,
|
|||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void show_ip_ospf_interface_traffic_sub(struct vty *vty,
|
||||||
|
struct ospf_interface *oi,
|
||||||
|
json_object *json_interface_sub,
|
||||||
|
u_char use_json)
|
||||||
|
{
|
||||||
|
if (use_json) {
|
||||||
|
json_object_int_add(json_interface_sub,
|
||||||
|
"ifIndex",
|
||||||
|
oi->ifp->ifindex);
|
||||||
|
json_object_int_add(json_interface_sub,
|
||||||
|
"helloIn",
|
||||||
|
oi->hello_in);
|
||||||
|
json_object_int_add(json_interface_sub,
|
||||||
|
"helloOut",
|
||||||
|
oi->hello_out);
|
||||||
|
json_object_int_add(json_interface_sub,
|
||||||
|
"dbDescIn",
|
||||||
|
oi->db_desc_in);
|
||||||
|
json_object_int_add(json_interface_sub,
|
||||||
|
"dbDescOut",
|
||||||
|
oi->db_desc_out);
|
||||||
|
json_object_int_add(json_interface_sub,
|
||||||
|
"lsReqIn",
|
||||||
|
oi->ls_req_in);
|
||||||
|
json_object_int_add(json_interface_sub,
|
||||||
|
"lsReqOut",
|
||||||
|
oi->ls_req_out);
|
||||||
|
json_object_int_add(json_interface_sub,
|
||||||
|
"lsUpdIn",
|
||||||
|
oi->ls_upd_in);
|
||||||
|
json_object_int_add(json_interface_sub,
|
||||||
|
"lsUpdOut",
|
||||||
|
oi->ls_upd_out);
|
||||||
|
json_object_int_add(json_interface_sub,
|
||||||
|
"lsAckIn",
|
||||||
|
oi->ls_ack_in);
|
||||||
|
json_object_int_add(json_interface_sub,
|
||||||
|
"lsAckOut",
|
||||||
|
oi->ls_ack_out);
|
||||||
|
} else {
|
||||||
|
vty_out(vty,
|
||||||
|
"%-10s %8u/%-8u %7u/%-7u %7u/%-7u %7u/%-7u %7u/%-7u\n",
|
||||||
|
oi->ifp->name, oi->hello_in,
|
||||||
|
oi->hello_out,
|
||||||
|
oi->db_desc_in, oi->db_desc_out,
|
||||||
|
oi->ls_req_in, oi->ls_req_out,
|
||||||
|
oi->ls_upd_in, oi->ls_upd_out,
|
||||||
|
oi->ls_ack_in, oi->ls_ack_out);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* OSPFv2 Packet Counters */
|
||||||
|
static int show_ip_ospf_interface_traffic_common(struct vty *vty,
|
||||||
|
struct ospf *ospf,
|
||||||
|
char *intf_name,
|
||||||
|
int display_once,
|
||||||
|
u_char use_json)
|
||||||
|
{
|
||||||
|
struct vrf *vrf = NULL;
|
||||||
|
struct interface *ifp = NULL;
|
||||||
|
json_object *json = NULL;
|
||||||
|
json_object *json_interface_sub = NULL;
|
||||||
|
|
||||||
|
if (!use_json && !display_once) {
|
||||||
|
vty_out(vty, "\n");
|
||||||
|
vty_out(vty, "%-12s%-17s%-17s%-17s%-17s%-17s\n",
|
||||||
|
"Interface", " HELLO", " DB-Desc", " LS-Req",
|
||||||
|
" LS-Update", " LS-Ack");
|
||||||
|
vty_out(vty, "%-10s%-18s%-18s%-17s%-17s%-17s\n", "",
|
||||||
|
" Rx/Tx", " Rx/Tx", " Rx/Tx", " Rx/Tx", " Rx/Tx");
|
||||||
|
vty_out(vty,
|
||||||
|
"--------------------------------------------------------------------------------------------\n");
|
||||||
|
} else if (use_json) {
|
||||||
|
json = json_object_new_object();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (intf_name == NULL) {
|
||||||
|
vrf = vrf_lookup_by_id(ospf->vrf_id);
|
||||||
|
FOR_ALL_INTERFACES (vrf, ifp) {
|
||||||
|
struct route_node *rn;
|
||||||
|
struct ospf_interface *oi;
|
||||||
|
|
||||||
|
if (ospf_oi_count(ifp) == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
for (rn = route_top(IF_OIFS(ifp)); rn;
|
||||||
|
rn = route_next(rn)) {
|
||||||
|
oi = rn->info;
|
||||||
|
|
||||||
|
if (oi == NULL)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (use_json) {
|
||||||
|
json_interface_sub =
|
||||||
|
json_object_new_object();
|
||||||
|
}
|
||||||
|
|
||||||
|
show_ip_ospf_interface_traffic_sub(vty, oi,
|
||||||
|
json_interface_sub,
|
||||||
|
use_json);
|
||||||
|
if (use_json) {
|
||||||
|
json_object_object_add(json, ifp->name,
|
||||||
|
json_interface_sub);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* Interface name is specified. */
|
||||||
|
ifp = if_lookup_by_name(intf_name, ospf->vrf_id);
|
||||||
|
if (ifp != NULL) {
|
||||||
|
struct route_node *rn;
|
||||||
|
struct ospf_interface *oi;
|
||||||
|
|
||||||
|
if (ospf_oi_count(ifp) == 0) {
|
||||||
|
vty_out(vty, " OSPF not enabled on this interface %s\n",
|
||||||
|
ifp->name);
|
||||||
|
return CMD_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (rn = route_top(IF_OIFS(ifp)); rn;
|
||||||
|
rn = route_next(rn)) {
|
||||||
|
oi = rn->info;
|
||||||
|
|
||||||
|
if (use_json) {
|
||||||
|
json_interface_sub =
|
||||||
|
json_object_new_object();
|
||||||
|
}
|
||||||
|
|
||||||
|
show_ip_ospf_interface_traffic_sub(vty, oi,
|
||||||
|
json_interface_sub,
|
||||||
|
use_json);
|
||||||
|
if (use_json) {
|
||||||
|
json_object_object_add(json, ifp->name,
|
||||||
|
json_interface_sub);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (use_json) {
|
||||||
|
vty_out(vty, "%s\n", json_object_to_json_string_ext(
|
||||||
|
json, JSON_C_TO_STRING_PRETTY));
|
||||||
|
json_object_free(json);
|
||||||
|
}
|
||||||
|
|
||||||
|
return CMD_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
DEFUN (show_ip_ospf_interface,
|
DEFUN (show_ip_ospf_interface,
|
||||||
show_ip_ospf_interface_cmd,
|
show_ip_ospf_interface_cmd,
|
||||||
"show ip ospf [vrf <NAME|all>] interface [INTERFACE] [json]",
|
"show ip ospf [vrf <NAME|all>] interface [INTERFACE] [json]",
|
||||||
@ -3753,6 +3901,71 @@ DEFUN (show_ip_ospf_instance_interface,
|
|||||||
return show_ip_ospf_interface_common(vty, ospf, argc, argv, 5, uj);
|
return show_ip_ospf_interface_common(vty, ospf, argc, argv, 5, uj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEFUN (show_ip_ospf_interface_traffic,
|
||||||
|
show_ip_ospf_interface_traffic_cmd,
|
||||||
|
"show ip ospf [vrf <NAME|all>] interface traffic [INTERFACE] [json]",
|
||||||
|
SHOW_STR
|
||||||
|
IP_STR
|
||||||
|
"OSPF information\n"
|
||||||
|
VRF_CMD_HELP_STR
|
||||||
|
"All VRFs\n"
|
||||||
|
"Interface information\n"
|
||||||
|
"Protocol Packet counters\n"
|
||||||
|
"Interface name\n"
|
||||||
|
JSON_STR)
|
||||||
|
{
|
||||||
|
struct ospf *ospf = NULL;
|
||||||
|
struct listnode *node = NULL;
|
||||||
|
char *vrf_name = NULL, *intf_name = NULL;
|
||||||
|
bool all_vrf = FALSE;
|
||||||
|
int inst = 0;
|
||||||
|
int idx_vrf = 0, idx_intf = 0;
|
||||||
|
u_char uj = use_json(argc, argv);
|
||||||
|
int ret = CMD_SUCCESS;
|
||||||
|
int display_once = 0;
|
||||||
|
|
||||||
|
if (uj)
|
||||||
|
argc--;
|
||||||
|
|
||||||
|
|
||||||
|
OSPF_FIND_VRF_ARGS(argv, argc, idx_vrf, vrf_name, all_vrf);
|
||||||
|
|
||||||
|
if (argv_find(argv, argc, "INTERFACE", &idx_intf))
|
||||||
|
intf_name = argv[idx_intf]->arg;
|
||||||
|
|
||||||
|
if (vrf_name) {
|
||||||
|
if (all_vrf) {
|
||||||
|
for (ALL_LIST_ELEMENTS_RO(om->ospf, node, ospf)) {
|
||||||
|
if (!ospf->oi_running)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
ret = show_ip_ospf_interface_traffic_common(vty,
|
||||||
|
ospf, intf_name,
|
||||||
|
display_once,
|
||||||
|
uj);
|
||||||
|
display_once = 1;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
ospf = ospf_lookup_by_inst_name(inst, vrf_name);
|
||||||
|
if (ospf == NULL || !ospf->oi_running)
|
||||||
|
return CMD_SUCCESS;
|
||||||
|
ret = show_ip_ospf_interface_traffic_common(vty, ospf,
|
||||||
|
intf_name,
|
||||||
|
display_once, uj);
|
||||||
|
} else {
|
||||||
|
ospf = ospf_lookup_by_vrf_id(VRF_DEFAULT);
|
||||||
|
if (ospf == NULL || !ospf->oi_running)
|
||||||
|
return CMD_SUCCESS;
|
||||||
|
ret = show_ip_ospf_interface_traffic_common(vty, ospf,
|
||||||
|
intf_name,
|
||||||
|
display_once, uj);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void show_ip_ospf_neighbour_header(struct vty *vty)
|
static void show_ip_ospf_neighbour_header(struct vty *vty)
|
||||||
{
|
{
|
||||||
vty_out(vty, "\n%-15s %3s %-15s %9s %-15s %-20s %5s %5s %5s\n",
|
vty_out(vty, "\n%-15s %3s %-15s %9s %-15s %-20s %5s %5s %5s\n",
|
||||||
@ -9484,6 +9697,8 @@ void ospf_vty_show_init(void)
|
|||||||
install_element(VIEW_NODE, &show_ip_ospf_interface_cmd);
|
install_element(VIEW_NODE, &show_ip_ospf_interface_cmd);
|
||||||
|
|
||||||
install_element(VIEW_NODE, &show_ip_ospf_instance_interface_cmd);
|
install_element(VIEW_NODE, &show_ip_ospf_instance_interface_cmd);
|
||||||
|
/* "show ip ospf interface traffic */
|
||||||
|
install_element(VIEW_NODE, &show_ip_ospf_interface_traffic_cmd);
|
||||||
|
|
||||||
/* "show ip ospf neighbor" commands. */
|
/* "show ip ospf neighbor" commands. */
|
||||||
install_element(VIEW_NODE, &show_ip_ospf_neighbor_int_detail_cmd);
|
install_element(VIEW_NODE, &show_ip_ospf_neighbor_int_detail_cmd);
|
||||||
|
Loading…
Reference in New Issue
Block a user