summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bgpd/bgp_evpn.c6
-rw-r--r--bgpd/bgp_evpn_mh.c15
-rw-r--r--bgpd/bgp_evpn_mh.h2
-rw-r--r--bgpd/bgp_trace.h91
-rw-r--r--bgpd/bgpd.c3
-rw-r--r--doc/user/bgp.rst6
-rw-r--r--doc/user/ospfd.rst11
-rw-r--r--isisd/isis_cli.c9
-rw-r--r--isisd/isis_redist.c10
-rw-r--r--isisd/isisd.h8
-rw-r--r--lib/command_graph.h4
-rw-r--r--ospf6d/ospf6_flood.c1
-rw-r--r--ospf6d/ospf6_nssa.c16
-rw-r--r--python/clidef.py2
-rwxr-xr-xtools/frr_babeltrace.py163
-rw-r--r--zebra/zebra_vty.c1
16 files changed, 316 insertions, 32 deletions
diff --git a/bgpd/bgp_evpn.c b/bgpd/bgp_evpn.c
index 3219ae13b5..ea54c14222 100644
--- a/bgpd/bgp_evpn.c
+++ b/bgpd/bgp_evpn.c
@@ -54,6 +54,7 @@
#include "bgpd/bgp_mac.h"
#include "bgpd/bgp_vty.h"
#include "bgpd/bgp_nht.h"
+#include "bgpd/bgp_trace.h"
/*
* Definitions and external declarations.
@@ -653,6 +654,9 @@ static int bgp_zebra_send_remote_macip(struct bgp *bgp, struct bgpevpn *vpn,
&p->prefix.macip_addr.mac, &p->prefix.macip_addr.ip,
flags, seq, &remote_vtep_ip);
+ frrtrace(5, frr_bgp, evpn_mac_ip_zsend, add, vpn, p, remote_vtep_ip,
+ esi);
+
return zclient_send_message(zclient);
}
@@ -703,6 +707,8 @@ static int bgp_zebra_send_remote_vtep(struct bgp *bgp, struct bgpevpn *vpn,
add ? "ADD" : "DEL", vpn->vni,
&p->prefix.imet_addr.ip.ipaddr_v4);
+ frrtrace(3, frr_bgp, evpn_bum_vtep_zsend, add, vpn, p);
+
return zclient_send_message(zclient);
}
diff --git a/bgpd/bgp_evpn_mh.c b/bgpd/bgp_evpn_mh.c
index 34094a0bde..9316d218a2 100644
--- a/bgpd/bgp_evpn_mh.c
+++ b/bgpd/bgp_evpn_mh.c
@@ -50,6 +50,7 @@
#include "bgpd/bgp_label.h"
#include "bgpd/bgp_nht.h"
#include "bgpd/bgp_mpath.h"
+#include "bgpd/bgp_trace.h"
static void bgp_evpn_local_es_down(struct bgp *bgp,
struct bgp_evpn_es *es);
@@ -1225,6 +1226,8 @@ static struct bgp_evpn_es_vtep *bgp_evpn_es_vtep_new(struct bgp_evpn_es *es,
es_vtep->es = es;
es_vtep->vtep_ip.s_addr = vtep_ip.s_addr;
+ inet_ntop(AF_INET, &es_vtep->vtep_ip, es_vtep->vtep_str,
+ sizeof(es_vtep->vtep_str));
listnode_init(&es_vtep->es_listnode, es_vtep);
listnode_add_sort(es->es_vtep_list, &es_vtep->es_listnode);
@@ -1301,6 +1304,8 @@ static int bgp_zebra_send_remote_es_vtep(struct bgp *bgp,
zlog_debug("Tx %s Remote ESI %s VTEP %pI4", add ? "ADD" : "DEL",
es->esi_str, &es_vtep->vtep_ip);
+ frrtrace(3, frr_bgp, evpn_mh_vtep_zsend, add, es, es_vtep);
+
return zclient_send_message(zclient);
}
@@ -2522,6 +2527,8 @@ static void bgp_evpn_l3nhg_zebra_add_v4_or_v6(struct bgp_evpn_es_vrf *es_vrf,
es_vrf->bgp_vrf->vrf_id,
v4_nhg ? "v4_nhg" : "v6_nhg", nhg_id);
+ frrtrace(4, frr_bgp, evpn_mh_nhg_zsend, true, v4_nhg, nhg_id, es_vrf);
+
/* only the gateway ip changes for each NH. rest of the params
* are constant
*/
@@ -2558,6 +2565,8 @@ static void bgp_evpn_l3nhg_zebra_add_v4_or_v6(struct bgp_evpn_es_vrf *es_vrf,
zlog_debug("nhg %u vtep %pI4 l3-svi %d", api_nhg.id,
&es_vtep->vtep_ip,
es_vrf->bgp_vrf->l3vni_svi_ifindex);
+
+ frrtrace(3, frr_bgp, evpn_mh_nh_zsend, nhg_id, es_vtep, es_vrf);
}
if (!api_nhg.nexthop_num)
@@ -2603,6 +2612,10 @@ static void bgp_evpn_l3nhg_zebra_del_v4_or_v6(struct bgp_evpn_es_vrf *es_vrf,
es_vrf->es->esi_str, es_vrf->bgp_vrf->vrf_id,
v4_nhg ? "v4_nhg" : "v6_nhg", api_nhg.id);
+
+ frrtrace(4, frr_bgp, evpn_mh_nhg_zsend, false, v4_nhg, api_nhg.id,
+ es_vrf);
+
zclient_nhg_send(zclient, ZEBRA_NHG_DEL, &api_nhg);
}
@@ -4202,6 +4215,8 @@ static void bgp_evpn_nh_zebra_update_send(struct bgp_evpn_nh *nh, bool add)
nh->bgp_vrf->name, nh->nh_str);
}
+ frrtrace(2, frr_bgp, evpn_mh_nh_rmac_zsend, add, nh);
+
zclient_send_message(zclient);
}
diff --git a/bgpd/bgp_evpn_mh.h b/bgpd/bgp_evpn_mh.h
index 22a4215664..37a46c2f0e 100644
--- a/bgpd/bgp_evpn_mh.h
+++ b/bgpd/bgp_evpn_mh.h
@@ -145,6 +145,8 @@ struct bgp_evpn_es_vtep {
struct bgp_evpn_es *es; /* parent ES */
struct in_addr vtep_ip;
+ char vtep_str[INET6_ADDRSTRLEN];
+
uint32_t flags;
/* Rxed a Type4 route from this PE */
#define BGP_EVPNES_VTEP_ESR (1 << 0)
diff --git a/bgpd/bgp_trace.h b/bgpd/bgp_trace.h
index 303e06c9c9..91a190722b 100644
--- a/bgpd/bgp_trace.h
+++ b/bgpd/bgp_trace.h
@@ -34,7 +34,11 @@
#include <lttng/tracepoint.h>
#include "bgpd/bgpd.h"
+#include "bgpd/bgp_attr.h"
#include "lib/stream.h"
+#include "bgpd/bgp_evpn_private.h"
+#include "bgpd/bgp_evpn_mh.h"
+
/* clang-format off */
@@ -243,6 +247,93 @@ TRACEPOINT_EVENT(
)
TRACEPOINT_LOGLEVEL(frr_bgp, bgp_dest_unlock, TRACE_INFO)
+TRACEPOINT_EVENT(
+ frr_bgp,
+ evpn_mac_ip_zsend,
+ TP_ARGS(int, add, struct bgpevpn *, vpn,
+ const struct prefix_evpn *, pfx,
+ struct in_addr, vtep, esi_t *, esi),
+ TP_FIELDS(
+ ctf_string(action, add ? "add" : "del")
+ ctf_integer(vni_t, vni, vpn->vni)
+ ctf_array(unsigned char, mac, &pfx->prefix.macip_addr.mac,
+ sizeof(struct ethaddr))
+ ctf_array(unsigned char, ip, &pfx->prefix.macip_addr.ip,
+ sizeof(struct ipaddr))
+ ctf_integer_network_hex(unsigned int, vtep, vtep.s_addr)
+ ctf_array(unsigned char, esi, esi, sizeof(esi_t))
+ )
+)
+TRACEPOINT_LOGLEVEL(frr_bgp, evpn_mac_ip_zsend, TRACE_INFO)
+
+TRACEPOINT_EVENT(
+ frr_bgp,
+ evpn_bum_vtep_zsend,
+ TP_ARGS(int, add, struct bgpevpn *, vpn,
+ const struct prefix_evpn *, pfx),
+ TP_FIELDS(
+ ctf_string(action, add ? "add" : "del")
+ ctf_integer(vni_t, vni, vpn->vni)
+ ctf_integer_network_hex(unsigned int, vtep,
+ pfx->prefix.imet_addr.ip.ipaddr_v4.s_addr)
+ )
+)
+TRACEPOINT_LOGLEVEL(frr_bgp, evpn_bum_vtep_zsend, TRACE_INFO)
+
+TRACEPOINT_EVENT(
+ frr_bgp,
+ evpn_mh_vtep_zsend,
+ TP_ARGS(bool, add, struct bgp_evpn_es *, es,
+ struct bgp_evpn_es_vtep *, es_vtep),
+ TP_FIELDS(
+ ctf_string(action, add ? "add" : "del")
+ ctf_string(esi, es->esi_str)
+ ctf_string(vtep, es_vtep->vtep_str)
+ )
+)
+TRACEPOINT_LOGLEVEL(frr_bgp, evpn_mh_vtep_zsend, TRACE_INFO)
+
+TRACEPOINT_EVENT(
+ frr_bgp,
+ evpn_mh_nhg_zsend,
+ TP_ARGS(bool, add, bool, type_v4, uint32_t, nhg_id,
+ struct bgp_evpn_es_vrf *, es_vrf),
+ TP_FIELDS(
+ ctf_string(action, add ? "add" : "del")
+ ctf_string(type, type_v4 ? "v4" : "v6")
+ ctf_integer(unsigned int, nhg, nhg_id)
+ ctf_string(esi, es_vrf->es->esi_str)
+ ctf_integer(int, vrf, es_vrf->bgp_vrf->vrf_id)
+ )
+)
+TRACEPOINT_LOGLEVEL(frr_bgp, evpn_mh_nhg_zsend, TRACE_INFO)
+
+TRACEPOINT_EVENT(
+ frr_bgp,
+ evpn_mh_nh_zsend,
+ TP_ARGS(uint32_t, nhg_id, struct bgp_evpn_es_vtep *, vtep,
+ struct bgp_evpn_es_vrf *, es_vrf),
+ TP_FIELDS(
+ ctf_integer(unsigned int, nhg, nhg_id)
+ ctf_string(vtep, vtep->vtep_str)
+ ctf_integer(int, svi, es_vrf->bgp_vrf->l3vni_svi_ifindex)
+ )
+)
+TRACEPOINT_LOGLEVEL(frr_bgp, evpn_mh_nh_zsend, TRACE_INFO)
+
+TRACEPOINT_EVENT(
+ frr_bgp,
+ evpn_mh_nh_rmac_zsend,
+ TP_ARGS(bool, add, struct bgp_evpn_nh *, nh),
+ TP_FIELDS(
+ ctf_string(action, add ? "add" : "del")
+ ctf_integer(int, vrf, nh->bgp_vrf->vrf_id)
+ ctf_string(nh, nh->nh_str)
+ ctf_array(unsigned char, rmac, &nh->rmac,
+ sizeof(struct ethaddr))
+ )
+)
+TRACEPOINT_LOGLEVEL(frr_bgp, evpn_nh_rmac_zsend, TRACE_INFO)
/* clang-format on */
#include <lttng/tracepoint-event.h>
diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c
index ec91e7e229..925af80cb7 100644
--- a/bgpd/bgpd.c
+++ b/bgpd/bgpd.c
@@ -6266,7 +6266,8 @@ static void peer_distribute_update(struct access_list *access)
for (ALL_LIST_ELEMENTS(bm->bgp, mnode, mnnode, bgp)) {
if (access->name)
- update_group_policy_update(bgp, BGP_POLICY_FILTER_LIST,
+ update_group_policy_update(bgp,
+ BGP_POLICY_DISTRIBUTE_LIST,
access->name, 0, 0);
for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
FOREACH_AFI_SAFI (afi, safi) {
diff --git a/doc/user/bgp.rst b/doc/user/bgp.rst
index 5c9d96e32b..d37c2b6682 100644
--- a/doc/user/bgp.rst
+++ b/doc/user/bgp.rst
@@ -2145,7 +2145,7 @@ Numbered Community Lists
When number is used for BGP community list name, the number has
special meanings. Community list number in the range from 1 and 99 is
standard community list. Community list number in the range from 100
-to 199 is expanded community list. These community lists are called
+to 500 is expanded community list. These community lists are called
as numbered community lists. On the other hand normal community lists
is called as named community lists.
@@ -2154,10 +2154,10 @@ is called as named community lists.
This command defines a new community list. The argument to (1-99) defines
the list identifier.
-.. clicmd:: bgp community-list (100-199) permit|deny COMMUNITY
+.. clicmd:: bgp community-list (100-500) permit|deny COMMUNITY
This command defines a new expanded community list. The argument to
- (100-199) defines the list identifier.
+ (100-500) defines the list identifier.
.. _bgp-community-alias:
diff --git a/doc/user/ospfd.rst b/doc/user/ospfd.rst
index 0122e2ac75..26675c27fd 100644
--- a/doc/user/ospfd.rst
+++ b/doc/user/ospfd.rst
@@ -691,13 +691,12 @@ Redistribution
the 'always' keyword is given then the default is always advertised, even
when there is no default present in the routing table.
-.. clicmd:: distribute-list NAME out (kernel|connected|static|rip|ospf
-
-
.. _ospf-distribute-list:
+.. clicmd:: distribute-list NAME out <kernel|connected|static|rip|isis|bgp|eigrp|nhrp|table|vnc|babel|openfabric>
+
Apply the access-list filter, NAME, to redistributed routes of the given
- type before allowing the routes to redistributed into OSPF
+ type before allowing the routes to be redistributed into OSPF
(:ref:`ospf redistribution <ospf-redistribute>`).
.. clicmd:: default-metric (0-16777214)
@@ -954,8 +953,6 @@ Router Information
Show Router Capabilities PCE parameters.
-.. _debugging-ospf:
-
Segment Routing
===============
@@ -1042,6 +1039,8 @@ TI-LFA requires a proper Segment Routing configuration.
Note that so far only P2P interfaces are supported.
+.. _debugging-ospf:
+
Debugging OSPF
==============
diff --git a/isisd/isis_cli.c b/isisd/isis_cli.c
index 70ec66fd7f..f48b142b1a 100644
--- a/isisd/isis_cli.c
+++ b/isisd/isis_cli.c
@@ -1330,11 +1330,14 @@ void cli_show_isis_def_origin_ipv6(struct vty *vty, struct lyd_node *dnode,
* XPath: /frr-isisd:isis/instance/redistribute
*/
DEFPY_YANG(isis_redistribute, isis_redistribute_cmd,
- "[no] redistribute <ipv4|ipv6>$ip " PROTO_REDIST_STR
- "$proto <level-1|level-2>$level [{metric (0-16777215)|route-map WORD}]",
+ "[no] redistribute <ipv4$ip " PROTO_IP_REDIST_STR "$proto|ipv6$ip "
+ PROTO_IP6_REDIST_STR "$proto> <level-1|level-2>$level"
+ "[{metric (0-16777215)|route-map WORD}]",
NO_STR REDIST_STR
"Redistribute IPv4 routes\n"
- "Redistribute IPv6 routes\n" PROTO_REDIST_HELP
+ PROTO_IP_REDIST_HELP
+ "Redistribute IPv6 routes\n"
+ PROTO_IP6_REDIST_HELP
"Redistribute into level-1\n"
"Redistribute into level-2\n"
"Metric for redistributed routes\n"
diff --git a/isisd/isis_redist.c b/isisd/isis_redist.c
index 2f5e490da1..45d69bc352 100644
--- a/isisd/isis_redist.c
+++ b/isisd/isis_redist.c
@@ -543,12 +543,13 @@ void isis_redist_area_finish(struct isis_area *area)
#ifdef FABRICD
DEFUN (isis_redistribute,
isis_redistribute_cmd,
- "redistribute <ipv4|ipv6> " PROTO_REDIST_STR
+ "redistribute <ipv4 " PROTO_IP_REDIST_STR "|ipv6 " PROTO_IP6_REDIST_STR ">"
" [{metric (0-16777215)|route-map WORD}]",
REDIST_STR
"Redistribute IPv4 routes\n"
+ PROTO_IP_REDIST_HELP
"Redistribute IPv6 routes\n"
- PROTO_REDIST_HELP
+ PROTO_IP6_REDIST_HELP
"Metric for redistributed routes\n"
"ISIS default metric\n"
"Route map reference\n"
@@ -599,12 +600,13 @@ DEFUN (isis_redistribute,
DEFUN (no_isis_redistribute,
no_isis_redistribute_cmd,
- "no redistribute <ipv4|ipv6> " PROTO_REDIST_STR,
+ "no redistribute <ipv4 " PROTO_IP_REDIST_STR "|ipv6 " PROTO_IP6_REDIST_STR ">",
NO_STR
REDIST_STR
"Redistribute IPv4 routes\n"
+ PROTO_IP_REDIST_HELP
"Redistribute IPv6 routes\n"
- PROTO_REDIST_HELP)
+ PROTO_IP6_REDIST_HELP)
{
int idx_afi = 2;
int idx_protocol = 3;
diff --git a/isisd/isisd.h b/isisd/isisd.h
index 64fbf78a07..13f3475b70 100644
--- a/isisd/isisd.h
+++ b/isisd/isisd.h
@@ -46,7 +46,11 @@ static const bool fabricd = true;
#define PROTO_NAME "openfabric"
#define PROTO_HELP "OpenFabric routing protocol\n"
#define PROTO_REDIST_STR FRR_REDIST_STR_FABRICD
+#define PROTO_IP_REDIST_STR FRR_IP_REDIST_STR_FABRICD
+#define PROTO_IP6_REDIST_STR FRR_IP6_REDIST_STR_FABRICD
#define PROTO_REDIST_HELP FRR_REDIST_HELP_STR_FABRICD
+#define PROTO_IP_REDIST_HELP FRR_IP_REDIST_HELP_STR_FABRICD
+#define PROTO_IP6_REDIST_HELP FRR_IP6_REDIST_HELP_STR_FABRICD
#define ROUTER_NODE OPENFABRIC_NODE
#else
static const bool fabricd = false;
@@ -54,7 +58,11 @@ static const bool fabricd = false;
#define PROTO_NAME "isis"
#define PROTO_HELP "IS-IS routing protocol\n"
#define PROTO_REDIST_STR FRR_REDIST_STR_ISISD
+#define PROTO_IP_REDIST_STR FRR_IP_REDIST_STR_ISISD
+#define PROTO_IP6_REDIST_STR FRR_IP6_REDIST_STR_ISISD
#define PROTO_REDIST_HELP FRR_REDIST_HELP_STR_ISISD
+#define PROTO_IP_REDIST_HELP FRR_IP_REDIST_HELP_STR_ISISD
+#define PROTO_IP6_REDIST_HELP FRR_IP6_REDIST_HELP_STR_ISISD
#define ROUTER_NODE ISIS_NODE
extern void isis_cli_init(void);
#endif
diff --git a/lib/command_graph.h b/lib/command_graph.h
index c20c9874c2..86157f872e 100644
--- a/lib/command_graph.h
+++ b/lib/command_graph.h
@@ -79,11 +79,11 @@ enum { CMD_ATTR_NORMAL,
CMD_ATTR_YANG,
};
-/* Comamand token struct. */
+/* Command token struct. */
struct cmd_token {
enum cmd_token_type type; // token type
uint8_t attr; // token attributes
- bool allowrepeat; // matcher allowed to match token repetively?
+ bool allowrepeat; // matcher allowed to match token repetitively?
uint32_t refcnt;
char *text; // token text
diff --git a/ospf6d/ospf6_flood.c b/ospf6d/ospf6_flood.c
index 186eac35a5..3a242575cd 100644
--- a/ospf6d/ospf6_flood.c
+++ b/ospf6d/ospf6_flood.c
@@ -288,7 +288,6 @@ void ospf6_install_lsa(struct ospf6_lsa *lsa)
monotime(&now);
if (!OSPF6_LSA_IS_MAXAGE(lsa)) {
- lsa->expire = NULL;
thread_add_timer(master, ospf6_lsa_expire, lsa,
OSPF_LSA_MAXAGE + lsa->birth.tv_sec
- now.tv_sec,
diff --git a/ospf6d/ospf6_nssa.c b/ospf6d/ospf6_nssa.c
index 2339d339f7..809768fb5c 100644
--- a/ospf6d/ospf6_nssa.c
+++ b/ospf6d/ospf6_nssa.c
@@ -304,24 +304,16 @@ void ospf6_abr_remove_unapproved_summaries(struct ospf6 *ospf6)
type = htons(OSPF6_LSTYPE_INTER_ROUTER);
for (ALL_LSDB_TYPED_ADVRTR(area->lsdb, type, ospf6->router_id,
lsa)) {
- if (CHECK_FLAG(lsa->flag, OSPF6_LSA_UNAPPROVED)) {
- lsa->header->age = htons(OSPF_LSA_MAXAGE);
- THREAD_OFF(lsa->refresh);
- thread_execute(master, ospf6_lsa_expire, lsa,
- 0);
- }
+ if (CHECK_FLAG(lsa->flag, OSPF6_LSA_UNAPPROVED))
+ ospf6_lsa_premature_aging(lsa);
}
/* Inter area prefix LSA */
type = htons(OSPF6_LSTYPE_INTER_PREFIX);
for (ALL_LSDB_TYPED_ADVRTR(area->lsdb, type, ospf6->router_id,
lsa)) {
- if (CHECK_FLAG(lsa->flag, OSPF6_LSA_UNAPPROVED)) {
- lsa->header->age = htons(OSPF_LSA_MAXAGE);
- THREAD_OFF(lsa->refresh);
- thread_execute(master, ospf6_lsa_expire, lsa,
- 0);
- }
+ if (CHECK_FLAG(lsa->flag, OSPF6_LSA_UNAPPROVED))
+ ospf6_lsa_premature_aging(lsa);
}
}
diff --git a/python/clidef.py b/python/clidef.py
index a47cee2d6b..ba7c9072c5 100644
--- a/python/clidef.py
+++ b/python/clidef.py
@@ -435,6 +435,8 @@ if __name__ == "__main__":
macros.load(os.path.join(basepath, "bgpd/bgp_vty.h"))
# sigh :(
macros["PROTO_REDIST_STR"] = "FRR_REDIST_STR_ISISD"
+ macros["PROTO_IP_REDIST_STR"] = "FRR_IP_REDIST_STR_ISISD"
+ macros["PROTO_IP6_REDIST_STR"] = "FRR_IP6_REDIST_STR_ISISD"
errors = process_file(args.cfile, ofd, dumpfd, args.all_defun, macros)
if errors != 0:
diff --git a/tools/frr_babeltrace.py b/tools/frr_babeltrace.py
new file mode 100755
index 0000000000..3058395758
--- /dev/null
+++ b/tools/frr_babeltrace.py
@@ -0,0 +1,163 @@
+#!/usr/bin/env python3
+'''
+Usage: frr_babeltrace.py trace_path
+
+FRR pushes data into lttng tracepoints in the least overhead way possible
+i.e. as binary-data/crf_arrays. These traces need to be converted into pretty
+strings for easy greping etc. This script is a babeltrace python plugin for
+that pretty printing.
+
+Copyright (C) 2021 NVIDIA Corporation
+Anuradha Karuppiah
+
+This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 2 of the License, or (at your option)
+any later version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+more details.
+
+You should have received a copy of the GNU General Public License along
+with this program; see the file COPYING; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+'''
+
+import ipaddress
+import socket
+import sys
+
+import babeltrace
+
+########################### common parsers - start ############################
+def print_ip_addr(field_val):
+ '''
+ pretty print "struct ipaddr"
+ '''
+ if field_val[0] == socket.AF_INET:
+ addr = [str(fv) for fv in field_val[4:8]]
+ return str(ipaddress.IPv4Address('.'.join(addr)))
+
+ if field_val[0] == socket.AF_INET6:
+ tmp = ''.join('%02x' % fb for fb in field_val[4:])
+ addr = []
+ while tmp:
+ addr.append(tmp[:4])
+ tmp = tmp[4:]
+ addr = ':'.join(addr)
+ return str(ipaddress.IPv6Address(addr))
+
+ if not field_val[0]:
+ return ''
+
+ return field_val
+
+
+def print_mac(field_val):
+ '''
+ pretty print "u8 mac[6]"
+ '''
+ return ':'.join('%02x' % fb for fb in field_val)
+
+def print_net_ipv4_addr(field_val):
+ '''
+ pretty print ctf_integer_network ipv4
+ '''
+ return str(ipaddress.IPv4Address(field_val))
+
+def print_esi(field_val):
+ '''
+ pretty print ethernet segment id, esi_t
+ '''
+ return ':'.join('%02x' % fb for fb in field_val)
+
+def get_field_list(event):
+ '''
+ only fetch fields added via the TP, skip metadata etc.
+ '''
+ return event.field_list_with_scope(babeltrace.CTFScope.EVENT_FIELDS)
+
+def parse_event(event, field_parsers):
+ '''
+ Wild card event parser; doesn't make things any prettier
+ '''
+ field_list = get_field_list(event)
+ field_info = {}
+ for field in field_list:
+ if field in field_parsers:
+ field_parser = field_parsers.get(field)
+ field_info[field] = field_parser(event.get(field))
+ else:
+ field_info[field] = event.get(field)
+ print(event.name, field_info)
+############################ common parsers - end #############################
+
+############################ evpn parsers - start #############################
+def parse_frr_bgp_evpn_mac_ip_zsend(event):
+ '''
+ bgp evpn mac-ip parser; raw format -
+ ctf_array(unsigned char, mac, &pfx->prefix.macip_addr.mac,
+ sizeof(struct ethaddr))
+ ctf_array(unsigned char, ip, &pfx->prefix.macip_addr.ip,
+ sizeof(struct ipaddr))
+ ctf_integer_network_hex(unsigned int, vtep, vtep.s_addr)
+ ctf_array(unsigned char, esi, esi, sizeof(esi_t))
+ '''
+ field_parsers = {'ip': print_ip_addr,
+ 'mac': print_mac,
+ 'esi': print_esi,
+ 'vtep': print_net_ipv4_addr}
+
+ parse_event(event, field_parsers)
+
+def parse_frr_bgp_evpn_bum_vtep_zsend(event):
+ '''
+ bgp evpn bum-vtep parser; raw format -
+ ctf_integer_network_hex(unsigned int, vtep,
+ pfx->prefix.imet_addr.ip.ipaddr_v4.s_addr)
+
+ '''
+ field_parsers = {'vtep': print_net_ipv4_addr}
+
+ parse_event(event, field_parsers)
+
+def parse_frr_bgp_evpn_mh_nh_rmac_send(event):
+ '''
+ bgp evpn nh-rmac parser; raw format -
+ ctf_array(unsigned char, rmac, &nh->rmac, sizeof(struct ethaddr))
+ '''
+ field_parsers = {'rmac': print_mac}
+
+ parse_event(event, field_parsers)
+
+############################ evpn parsers - end #############################
+
+def main():
+ '''
+ FRR lttng trace output parser; babel trace plugin
+ '''
+ event_parsers = {'frr_bgp:evpn_mac_ip_zsend':
+ parse_frr_bgp_evpn_mac_ip_zsend,
+ 'frr_bgp:evpn_bum_vtep_zsend':
+ parse_frr_bgp_evpn_bum_vtep_zsend,
+ 'frr_bgp:evpn_mh_nh_rmac_zsend':
+ parse_frr_bgp_evpn_mh_nh_rmac_send}
+
+ # get the trace path from the first command line argument
+ trace_path = sys.argv[1]
+
+ # grab events
+ trace_collection = babeltrace.TraceCollection()
+ trace_collection.add_traces_recursive(trace_path, 'ctf')
+
+ for event in trace_collection.events:
+ if event.name in event_parsers:
+ event_parser = event_parsers.get(event.name)
+ event_parser(event)
+ else:
+ parse_event(event, {})
+
+if __name__ == '__main__':
+ main()
diff --git a/zebra/zebra_vty.c b/zebra/zebra_vty.c
index 79087c5849..4b06e84788 100644
--- a/zebra/zebra_vty.c
+++ b/zebra/zebra_vty.c
@@ -965,6 +965,7 @@ static void vty_show_ip_route(struct vty *vty, struct route_node *rn,
json_object_int_add(json_route, "internalNextHopActiveNum",
nexthop_group_active_nexthop_num(
&(re->nhe->nhg)));
+ json_object_int_add(json_route, "nexthopGroupId", re->nhe_id);
json_object_string_add(json_route, "uptime", up_str);