summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfdd/control.c1
-rw-r--r--bgpd/bgp_clist.c2
-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--configure.ac2
-rw-r--r--doc/user/bgp.rst6
-rw-r--r--doc/user/isisd.rst4
-rw-r--r--doc/user/ospfd.rst11
-rw-r--r--docker/ubuntu20-ci/Dockerfile2
-rw-r--r--eigrpd/eigrp_filter.c4
-rw-r--r--eigrpd/eigrp_hello.c2
-rw-r--r--eigrpd/eigrp_interface.c2
-rw-r--r--eigrpd/eigrp_packet.c6
-rw-r--r--eigrpd/eigrp_update.c4
-rw-r--r--eigrpd/eigrpd.c1
-rw-r--r--isisd/fabricd.c1
-rw-r--r--isisd/isis_cli.c9
-rw-r--r--isisd/isis_redist.c10
-rw-r--r--isisd/isis_tx_queue.c1
-rw-r--r--isisd/isisd.h9
-rw-r--r--ldpd/accept.c4
-rw-r--r--ldpd/interface.c1
-rw-r--r--ldpd/lde.c2
-rw-r--r--ldpd/lde_lib.c1
-rw-r--r--ldpd/ldpd.c7
-rw-r--r--ldpd/ldpe.c6
-rw-r--r--ldpd/packet.c3
-rw-r--r--lib/command_graph.h4
-rw-r--r--lib/libfrr.c14
-rw-r--r--lib/module.c92
-rw-r--r--lib/module.h4
-rw-r--r--lib/northbound_grpc.cpp4
-rw-r--r--nhrpd/netlink_arp.c1
-rw-r--r--nhrpd/nhrp_event.c3
-rw-r--r--nhrpd/nhrp_multicast.c1
-rw-r--r--nhrpd/nhrp_nhs.c3
-rw-r--r--nhrpd/nhrp_peer.c1
-rw-r--r--nhrpd/nhrp_shortcut.c1
-rw-r--r--nhrpd/vici.c3
-rw-r--r--ospf6d/ospf6_asbr.c1
-rw-r--r--ospf6d/ospf6_flood.c18
-rw-r--r--ospf6d/ospf6_interface.c1
-rw-r--r--ospf6d/ospf6_lsa.c1
-rw-r--r--ospf6d/ospf6_message.c6
-rw-r--r--ospf6d/ospf6_neighbor.c4
-rw-r--r--ospf6d/ospf6_nssa.c16
-rw-r--r--ospfd/ospf_gr_helper.c6
-rw-r--r--ospfd/ospf_nsm.c7
-rw-r--r--pimd/pim_igmp.c2
-rw-r--r--pimd/pim_msdp_socket.c1
-rw-r--r--pimd/pim_pim.c1
-rw-r--r--python/clidef.py2
-rw-r--r--ripd/rip_interface.c1
-rw-r--r--ripd/rip_peer.c1
-rw-r--r--ripd/ripd.c12
-rw-r--r--ripngd/ripng_interface.c1
-rw-r--r--ripngd/ripngd.c11
-rw-r--r--ripngd/ripngd.h3
-rw-r--r--tests/lib/test_grpc.cpp18
-rw-r--r--tests/lib/test_timer_correctness.c1
-rw-r--r--tests/lib/test_timer_performance.c2
-rw-r--r--tests/topotests/bfd_ospf_topo1/rt1/ospf6d.conf4
-rw-r--r--tests/topotests/bfd_ospf_topo1/rt1/ospfd.conf6
-rw-r--r--tests/topotests/bfd_ospf_topo1/rt2/ospf6d.conf4
-rw-r--r--tests/topotests/bfd_ospf_topo1/rt2/ospfd.conf6
-rw-r--r--tests/topotests/bfd_ospf_topo1/rt3/ospf6d.conf4
-rw-r--r--tests/topotests/bfd_ospf_topo1/rt3/ospfd.conf6
-rw-r--r--tests/topotests/bfd_ospf_topo1/rt4/ospf6d.conf4
-rw-r--r--tests/topotests/bfd_ospf_topo1/rt4/ospfd.conf6
-rw-r--r--tests/topotests/bfd_ospf_topo1/rt5/ospf6d.conf4
-rw-r--r--tests/topotests/bfd_ospf_topo1/rt5/ospfd.conf6
-rwxr-xr-xtests/topotests/bfd_ospf_topo1/test_bfd_ospf_topo1.py11
-rw-r--r--tests/topotests/bgp_l3vpn_to_bgp_vrf/customize.py7
-rw-r--r--tests/topotests/lib/ltemplate.py6
-rw-r--r--tests/topotests/lib/pim.py4
-rw-r--r--tools/coccinelle/struct_thread_null.cocci9
-rwxr-xr-xtools/frr_babeltrace.py163
-rw-r--r--watchfrr/watchfrr.c6
-rw-r--r--zebra/if_netlink.c12
-rw-r--r--zebra/irdp_main.c1
-rw-r--r--zebra/irdp_packet.c1
-rw-r--r--zebra/kernel_netlink.c10
-rw-r--r--zebra/kernel_netlink.h4
-rw-r--r--zebra/rt_netlink.c28
-rw-r--r--zebra/rule_netlink.c4
-rw-r--r--zebra/zebra_netns_notify.c1
-rw-r--r--zebra/zebra_vty.c1
90 files changed, 542 insertions, 241 deletions
diff --git a/bfdd/control.c b/bfdd/control.c
index 4929bf1998..e772aadfc4 100644
--- a/bfdd/control.c
+++ b/bfdd/control.c
@@ -167,7 +167,6 @@ int control_accept(struct thread *t)
control_new(csock);
- bglobal.bg_csockev = NULL;
thread_add_read(master, control_accept, NULL, sd, &bglobal.bg_csockev);
return 0;
diff --git a/bgpd/bgp_clist.c b/bgpd/bgp_clist.c
index 33e3db2c16..0e590a463c 100644
--- a/bgpd/bgp_clist.c
+++ b/bgpd/bgp_clist.c
@@ -720,7 +720,7 @@ bool lcommunity_list_exact_match(struct lcommunity *lcom,
return entry->direct == COMMUNITY_PERMIT;
if (entry->style == LARGE_COMMUNITY_LIST_STANDARD) {
- if (lcommunity_cmp(lcom, entry->u.com))
+ if (lcommunity_cmp(lcom, entry->u.lcom))
return entry->direct == COMMUNITY_PERMIT;
} else if (entry->style == LARGE_COMMUNITY_LIST_EXPANDED) {
if (lcommunity_regexp_match(lcom, entry->reg))
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/configure.ac b/configure.ac
index f792b1c652..873ed18db8 100644
--- a/configure.ac
+++ b/configure.ac
@@ -7,7 +7,7 @@
##
AC_PREREQ([2.69])
-AC_INIT([frr], [8.1-dev], [https://github.com/frrouting/frr/issues])
+AC_INIT([frr], [8.2-dev], [https://github.com/frrouting/frr/issues])
PACKAGE_URL="https://frrouting.org/"
AC_SUBST([PACKAGE_URL])
PACKAGE_FULLNAME="FRRouting"
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/isisd.rst b/doc/user/isisd.rst
index 66f8fd5678..4a711a8feb 100644
--- a/doc/user/isisd.rst
+++ b/doc/user/isisd.rst
@@ -394,10 +394,6 @@ Known limitations:
clear the Node flag that is set by default for Prefix-SIDs associated to
loopback addresses. This option is necessary to configure Anycast-SIDs.
-.. clicmd:: show isis segment-routing prefix-sids
-
- Show detailed information about all learned Segment Routing Prefix-SIDs.
-
.. clicmd:: show isis segment-routing nodes
Show detailed information about all learned Segment Routing Nodes.
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/docker/ubuntu20-ci/Dockerfile b/docker/ubuntu20-ci/Dockerfile
index 032db8b8ed..b9fe385c3a 100644
--- a/docker/ubuntu20-ci/Dockerfile
+++ b/docker/ubuntu20-ci/Dockerfile
@@ -11,7 +11,6 @@ RUN apt update && \
install-info build-essential libsnmp-dev perl \
libcap-dev python2 libelf-dev \
sudo gdb curl iputils-ping time \
- libgrpc++-dev libgrpc-dev protobuf-compiler-grpc \
lua5.3 liblua5.3-dev \
net-tools iproute2 && \
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output /tmp/get-pip.py && \
@@ -61,7 +60,6 @@ RUN cd ~/frr && \
--sbindir=/usr/lib/frr \
--sysconfdir=/etc/frr \
--enable-vtysh \
- --enable-grpc \
--enable-pimd \
--enable-sharpd \
--enable-multipath=64 \
diff --git a/eigrpd/eigrp_filter.c b/eigrpd/eigrp_filter.c
index 8f80b78d20..bb0cf51bd8 100644
--- a/eigrpd/eigrp_filter.c
+++ b/eigrpd/eigrp_filter.c
@@ -203,9 +203,8 @@ void eigrp_distribute_update(struct distribute_ctx *ctx,
/* Cancel GR scheduled */
thread_cancel(&(ei->t_distribute));
/* schedule Graceful restart for interface in 10sec */
- e->t_distribute = NULL;
thread_add_timer(master, eigrp_distribute_timer_interface, ei, 10,
- &e->t_distribute);
+ &ei->t_distribute);
}
/*
@@ -263,7 +262,6 @@ int eigrp_distribute_timer_process(struct thread *thread)
struct eigrp *eigrp;
eigrp = THREAD_ARG(thread);
- eigrp->t_distribute = NULL;
/* execute GR for whole process */
eigrp_update_send_process_GR(eigrp, EIGRP_GR_FILTER, NULL);
diff --git a/eigrpd/eigrp_hello.c b/eigrpd/eigrp_hello.c
index e3680b31a3..2ff8fc5f39 100644
--- a/eigrpd/eigrp_hello.c
+++ b/eigrpd/eigrp_hello.c
@@ -86,7 +86,6 @@ int eigrp_hello_timer(struct thread *thread)
struct eigrp_interface *ei;
ei = THREAD_ARG(thread);
- ei->t_hello = NULL;
if (IS_DEBUG_EIGRP(0, TIMERS))
zlog_debug("Start Hello Timer (%s) Expire [%u]", IF_NAME(ei),
@@ -96,7 +95,6 @@ int eigrp_hello_timer(struct thread *thread)
eigrp_hello_send(ei, EIGRP_HELLO_NORMAL, NULL);
/* Hello timer set. */
- ei->t_hello = NULL;
thread_add_timer(master, eigrp_hello_timer, ei, ei->params.v_hello,
&ei->t_hello);
diff --git a/eigrpd/eigrp_interface.c b/eigrpd/eigrp_interface.c
index 02e943043f..28987b4af6 100644
--- a/eigrpd/eigrp_interface.c
+++ b/eigrpd/eigrp_interface.c
@@ -265,7 +265,7 @@ int eigrp_if_up(struct eigrp_interface *ei)
/* Set multicast memberships appropriately for new state. */
eigrp_if_set_multicast(ei);
- thread_add_event(master, eigrp_hello_timer, ei, (1), NULL);
+ thread_add_event(master, eigrp_hello_timer, ei, (1), &ei->t_hello);
/*Prepare metrics*/
metric.bandwidth = eigrp_bandwidth_to_scaled(ei->params.bandwidth);
diff --git a/eigrpd/eigrp_packet.c b/eigrpd/eigrp_packet.c
index 39e384c121..529d94567d 100644
--- a/eigrpd/eigrp_packet.c
+++ b/eigrpd/eigrp_packet.c
@@ -340,8 +340,6 @@ int eigrp_write(struct thread *thread)
#endif /* WANT_EIGRP_WRITE_FRAGMENT */
#define EIGRP_WRITE_IPHL_SHIFT 2
- eigrp->t_write = NULL;
-
node = listhead(eigrp->oi_write_q);
assert(node);
ei = listgetdata(node);
@@ -470,7 +468,6 @@ out:
/* If packets still remain in queue, call write thread. */
if (!list_isempty(eigrp->oi_write_q)) {
- eigrp->t_write = NULL;
thread_add_write(master, eigrp_write, eigrp, eigrp->fd,
&eigrp->t_write);
}
@@ -497,7 +494,6 @@ int eigrp_read(struct thread *thread)
eigrp = THREAD_ARG(thread);
/* prepare for next packet. */
- eigrp->t_read = NULL;
thread_add_read(master, eigrp_read, eigrp, eigrp->fd, &eigrp->t_read);
stream_reset(eigrp->ibuf);
@@ -1013,7 +1009,6 @@ int eigrp_unack_packet_retrans(struct thread *thread)
return eigrp_retrans_count_exceeded(ep, nbr);
/*Start retransmission timer*/
- ep->t_retrans_timer = NULL;
thread_add_timer(master, eigrp_unack_packet_retrans, nbr,
EIGRP_PACKET_RETRANS_TIME,
&ep->t_retrans_timer);
@@ -1049,7 +1044,6 @@ int eigrp_unack_multicast_packet_retrans(struct thread *thread)
return eigrp_retrans_count_exceeded(ep, nbr);
/*Start retransmission timer*/
- ep->t_retrans_timer = NULL;
thread_add_timer(master, eigrp_unack_multicast_packet_retrans,
nbr, EIGRP_PACKET_RETRANS_TIME,
&ep->t_retrans_timer);
diff --git a/eigrpd/eigrp_update.c b/eigrpd/eigrp_update.c
index 0dc509706c..8a9eea8a79 100644
--- a/eigrpd/eigrp_update.c
+++ b/eigrpd/eigrp_update.c
@@ -917,12 +917,10 @@ int eigrp_update_send_GR_thread(struct thread *thread)
/* get argument from thread */
nbr = THREAD_ARG(thread);
/* remove this thread pointer */
- nbr->t_nbr_send_gr = NULL;
/* if there is packet waiting in queue,
* schedule this thread again with small delay */
if (nbr->retrans_queue->count > 0) {
- nbr->t_nbr_send_gr = NULL;
thread_add_timer_msec(master, eigrp_update_send_GR_thread, nbr,
10, &nbr->t_nbr_send_gr);
return 0;
@@ -934,7 +932,6 @@ int eigrp_update_send_GR_thread(struct thread *thread)
/* if it wasn't last chunk, schedule this thread again */
if (nbr->nbr_gr_packet_type != EIGRP_PACKET_PART_LAST) {
thread_execute(master, eigrp_update_send_GR_thread, nbr, 0);
- nbr->t_nbr_send_gr = NULL;
}
return 0;
@@ -1003,7 +1000,6 @@ void eigrp_update_send_GR(struct eigrp_neighbor *nbr, enum GR_type gr_type,
nbr->nbr_gr_packet_type = EIGRP_PACKET_PART_FIRST;
/* execute packet sending in thread */
thread_execute(master, eigrp_update_send_GR_thread, nbr, 0);
- nbr->t_nbr_send_gr = NULL;
}
/**
diff --git a/eigrpd/eigrpd.c b/eigrpd/eigrpd.c
index 1030154907..84d4f6aeeb 100644
--- a/eigrpd/eigrpd.c
+++ b/eigrpd/eigrpd.c
@@ -171,7 +171,6 @@ static struct eigrp *eigrp_new(uint16_t as, vrf_id_t vrf_id)
eigrp->ibuf = stream_new(EIGRP_PACKET_MAX_LEN + 1);
- eigrp->t_read = NULL;
thread_add_read(master, eigrp_read, eigrp, eigrp->fd, &eigrp->t_read);
eigrp->oi_write_q = list_new();
diff --git a/isisd/fabricd.c b/isisd/fabricd.c
index 20651706d3..0f10a1516a 100644
--- a/isisd/fabricd.c
+++ b/isisd/fabricd.c
@@ -413,7 +413,6 @@ static int fabricd_tier_calculation_cb(struct thread *thread)
{
struct fabricd *f = THREAD_ARG(thread);
uint8_t tier = ISIS_TIER_UNDEFINED;
- f->tier_calculation_timer = NULL;
tier = fabricd_calculate_fabric_tier(f->area);
if (tier == ISIS_TIER_UNDEFINED)
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/isis_tx_queue.c b/isisd/isis_tx_queue.c
index c7266152b7..d3da5b9d39 100644
--- a/isisd/isis_tx_queue.c
+++ b/isisd/isis_tx_queue.c
@@ -119,7 +119,6 @@ static int tx_queue_send_event(struct thread *thread)
struct isis_tx_queue_entry *e = THREAD_ARG(thread);
struct isis_tx_queue *queue = e->queue;
- e->retry = NULL;
thread_add_timer(master, tx_queue_send_event, e, 5, &e->retry);
if (e->is_retry)
diff --git a/isisd/isisd.h b/isisd/isisd.h
index 64fbf78a07..3febda1d87 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
@@ -248,7 +256,6 @@ void isis_terminate(void);
void isis_master_init(struct thread_master *master);
void isis_vrf_link(struct isis *isis, struct vrf *vrf);
void isis_vrf_unlink(struct isis *isis, struct vrf *vrf);
-void isis_global_instance_create(const char *vrf_name);
struct isis *isis_lookup_by_vrfid(vrf_id_t vrf_id);
struct isis *isis_lookup_by_vrfname(const char *vrfname);
struct isis *isis_lookup_by_sysid(const uint8_t *sysid);
diff --git a/ldpd/accept.c b/ldpd/accept.c
index 9bba0f5ddd..e8d3976ee9 100644
--- a/ldpd/accept.c
+++ b/ldpd/accept.c
@@ -58,7 +58,6 @@ accept_add(int fd, int (*cb)(struct thread *), void *arg)
av->arg = arg;
LIST_INSERT_HEAD(&accept_queue.queue, av, entry);
- av->ev = NULL;
thread_add_read(master, accept_cb, av, av->fd, &av->ev);
log_debug("%s: accepting on fd %d", __func__, fd);
@@ -86,7 +85,6 @@ accept_pause(void)
{
log_debug(__func__);
accept_unarm();
- accept_queue.evt = NULL;
thread_add_timer(master, accept_timeout, NULL, 1, &accept_queue.evt);
}
@@ -105,7 +103,6 @@ accept_arm(void)
{
struct accept_ev *av;
LIST_FOREACH(av, &accept_queue.queue, entry) {
- av->ev = NULL;
thread_add_read(master, accept_cb, av, av->fd, &av->ev);
}
}
@@ -122,7 +119,6 @@ static int
accept_cb(struct thread *thread)
{
struct accept_ev *av = THREAD_ARG(thread);
- av->ev = NULL;
thread_add_read(master, accept_cb, av, av->fd, &av->ev);
av->accept_cb(thread);
diff --git a/ldpd/interface.c b/ldpd/interface.c
index 3e9f2fa991..5e04eab1b3 100644
--- a/ldpd/interface.c
+++ b/ldpd/interface.c
@@ -471,7 +471,6 @@ static void
if_start_hello_timer(struct iface_af *ia)
{
thread_cancel(&ia->hello_timer);
- ia->hello_timer = NULL;
thread_add_timer(master, if_hello_timer, ia, if_get_hello_interval(ia),
&ia->hello_timer);
}
diff --git a/ldpd/lde.c b/ldpd/lde.c
index 2d35d097a1..babadc461f 100644
--- a/ldpd/lde.c
+++ b/ldpd/lde.c
@@ -145,7 +145,6 @@ lde(void)
fatal(NULL);
imsg_init(&iev_main->ibuf, LDPD_FD_ASYNC);
iev_main->handler_read = lde_dispatch_parent;
- iev_main->ev_read = NULL;
thread_add_read(master, iev_main->handler_read, iev_main, iev_main->ibuf.fd,
&iev_main->ev_read);
iev_main->handler_write = ldp_write_handler;
@@ -555,7 +554,6 @@ lde_dispatch_parent(struct thread *thread)
fatal(NULL);
imsg_init(&iev_ldpe->ibuf, fd);
iev_ldpe->handler_read = lde_dispatch_imsg;
- iev_ldpe->ev_read = NULL;
thread_add_read(master, iev_ldpe->handler_read, iev_ldpe, iev_ldpe->ibuf.fd,
&iev_ldpe->ev_read);
iev_ldpe->handler_write = ldp_write_handler;
diff --git a/ldpd/lde_lib.c b/ldpd/lde_lib.c
index 0f91f49920..33bb6c0fc7 100644
--- a/ldpd/lde_lib.c
+++ b/ldpd/lde_lib.c
@@ -1072,7 +1072,6 @@ void
lde_gc_start_timer(void)
{
thread_cancel(&gc_timer);
- gc_timer = NULL;
thread_add_timer(master, lde_gc_timer, NULL, LDE_GC_INTERVAL,
&gc_timer);
}
diff --git a/ldpd/ldpd.c b/ldpd/ldpd.c
index 000d1a3301..9d80bed77f 100644
--- a/ldpd/ldpd.c
+++ b/ldpd/ldpd.c
@@ -94,10 +94,9 @@ static void ldp_load_module(const char *name)
{
const char *dir;
dir = ldpd_di.module_path ? ldpd_di.module_path : frr_moduledir;
- char moderr[256];
struct frrmod_runtime *module;
- module = frrmod_load(name, dir, moderr, sizeof(moderr));
+ module = frrmod_load(name, dir, NULL,NULL);
if (!module) {
fprintf(stderr, "%s: failed to load %s", __func__, name);
log_warnx("%s: failed to load %s", __func__, name);
@@ -404,28 +403,24 @@ main(int argc, char *argv[])
fatal(NULL);
imsg_init(&iev_ldpe->ibuf, pipe_parent2ldpe[0]);
iev_ldpe->handler_read = main_dispatch_ldpe;
- iev_ldpe->ev_read = NULL;
thread_add_read(master, iev_ldpe->handler_read, iev_ldpe, iev_ldpe->ibuf.fd,
&iev_ldpe->ev_read);
iev_ldpe->handler_write = ldp_write_handler;
imsg_init(&iev_ldpe_sync->ibuf, pipe_parent2ldpe_sync[0]);
iev_ldpe_sync->handler_read = main_dispatch_ldpe;
- iev_ldpe_sync->ev_read = NULL;
thread_add_read(master, iev_ldpe_sync->handler_read, iev_ldpe_sync, iev_ldpe_sync->ibuf.fd,
&iev_ldpe_sync->ev_read);
iev_ldpe_sync->handler_write = ldp_write_handler;
imsg_init(&iev_lde->ibuf, pipe_parent2lde[0]);
iev_lde->handler_read = main_dispatch_lde;
- iev_lde->ev_read = NULL;
thread_add_read(master, iev_lde->handler_read, iev_lde, iev_lde->ibuf.fd,
&iev_lde->ev_read);
iev_lde->handler_write = ldp_write_handler;
imsg_init(&iev_lde_sync->ibuf, pipe_parent2lde_sync[0]);
iev_lde_sync->handler_read = main_dispatch_lde;
- iev_lde_sync->ev_read = NULL;
thread_add_read(master, iev_lde_sync->handler_read, iev_lde_sync, iev_lde_sync->ibuf.fd,
&iev_lde_sync->ev_read);
iev_lde_sync->handler_write = ldp_write_handler;
diff --git a/ldpd/ldpe.c b/ldpd/ldpe.c
index 428d2ab7b4..fff7ee7c67 100644
--- a/ldpd/ldpe.c
+++ b/ldpd/ldpe.c
@@ -122,7 +122,6 @@ ldpe(void)
fatal(NULL);
imsg_init(&iev_main->ibuf, LDPD_FD_ASYNC);
iev_main->handler_read = ldpe_dispatch_main;
- iev_main->ev_read = NULL;
thread_add_read(master, iev_main->handler_read, iev_main, iev_main->ibuf.fd,
&iev_main->ev_read);
iev_main->handler_write = ldp_write_handler;
@@ -149,7 +148,6 @@ ldpe_init(struct ldpd_init *init)
/* This socket must be open before dropping privileges. */
global.pfkeysock = pfkey_init();
if (sysdep.no_pfkey == 0) {
- pfkey_ev = NULL;
thread_add_read(master, ldpe_dispatch_pfkey, NULL, global.pfkeysock,
&pfkey_ev);
}
@@ -377,7 +375,6 @@ ldpe_dispatch_main(struct thread *thread)
fatal(NULL);
imsg_init(&iev_lde->ibuf, fd);
iev_lde->handler_read = ldpe_dispatch_lde;
- iev_lde->ev_read = NULL;
thread_add_read(master, iev_lde->handler_read, iev_lde, iev_lde->ibuf.fd,
&iev_lde->ev_read);
iev_lde->handler_write = ldp_write_handler;
@@ -784,7 +781,6 @@ ldpe_dispatch_pfkey(struct thread *thread)
{
int fd = THREAD_FD(thread);
- pfkey_ev = NULL;
thread_add_read(master, ldpe_dispatch_pfkey, NULL, global.pfkeysock,
&pfkey_ev);
@@ -805,13 +801,11 @@ ldpe_setup_sockets(int af, int disc_socket, int edisc_socket,
/* discovery socket */
af_global->ldp_disc_socket = disc_socket;
- af_global->disc_ev = NULL;
thread_add_read(master, disc_recv_packet, &af_global->disc_ev, af_global->ldp_disc_socket,
&af_global->disc_ev);
/* extended discovery socket */
af_global->ldp_edisc_socket = edisc_socket;
- af_global->edisc_ev = NULL;
thread_add_read(master, disc_recv_packet, &af_global->edisc_ev, af_global->ldp_edisc_socket,
&af_global->edisc_ev);
diff --git a/ldpd/packet.c b/ldpd/packet.c
index 8735faf3dd..56af16d280 100644
--- a/ldpd/packet.c
+++ b/ldpd/packet.c
@@ -141,7 +141,6 @@ disc_recv_packet(struct thread *thread)
struct in_addr lsr_id;
/* reschedule read */
- *threadp = NULL;
thread_add_read(master, disc_recv_packet, threadp, fd, threadp);
/* setup buffer */
@@ -425,7 +424,6 @@ session_read(struct thread *thread)
uint16_t pdu_len, msg_len, msg_size, max_pdu_len;
int ret;
- tcp->rev = NULL;
thread_add_read(master, session_read, nbr, fd, &tcp->rev);
if ((n = read(fd, tcp->rbuf->buf + tcp->rbuf->wpos,
@@ -745,7 +743,6 @@ tcp_new(int fd, struct nbr *nbr)
if ((tcp->rbuf = calloc(1, sizeof(struct ibuf_read))) == NULL)
fatal(__func__);
- tcp->rev = NULL;
thread_add_read(master, session_read, nbr, tcp->fd, &tcp->rev);
tcp->nbr = nbr;
}
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/lib/libfrr.c b/lib/libfrr.c
index d03437328b..9b05bb4fbf 100644
--- a/lib/libfrr.c
+++ b/lib/libfrr.c
@@ -674,13 +674,19 @@ static void frr_mkdir(const char *path, bool strip)
strerror(errno));
}
+static void _err_print(const void *cookie, const char *errstr)
+{
+ const char *prefix = (const char *)cookie;
+
+ fprintf(stderr, "%s: %s\n", prefix, errstr);
+}
+
static struct thread_master *master;
struct thread_master *frr_init(void)
{
struct option_chain *oc;
struct frrmod_runtime *module;
struct zprivs_ids_t ids;
- char moderr[256];
char p_instance[16] = "", p_pathspace[256] = "";
const char *dir;
dir = di->module_path ? di->module_path : frr_moduledir;
@@ -734,11 +740,9 @@ struct thread_master *frr_init(void)
frrmod_init(di->module);
while (modules) {
modules = (oc = modules)->next;
- module = frrmod_load(oc->arg, dir, moderr, sizeof(moderr));
- if (!module) {
- fprintf(stderr, "%s\n", moderr);
+ module = frrmod_load(oc->arg, dir, _err_print, __func__);
+ if (!module)
exit(1);
- }
XFREE(MTYPE_TMP, oc);
}
diff --git a/lib/module.c b/lib/module.c
index 1d51a6396d..4037bfbeb0 100644
--- a/lib/module.c
+++ b/lib/module.c
@@ -26,9 +26,11 @@
#include "module.h"
#include "memory.h"
#include "lib/version.h"
+#include "printfrr.h"
DEFINE_MTYPE_STATIC(LIB, MODULE_LOADNAME, "Module loading name");
DEFINE_MTYPE_STATIC(LIB, MODULE_LOADARGS, "Module loading arguments");
+DEFINE_MTYPE_STATIC(LIB, MODULE_LOAD_ERR, "Module loading error");
static struct frrmod_info frrmod_default_info = {
.name = "libfrr",
@@ -67,14 +69,64 @@ void frrmod_init(struct frrmod_runtime *modinfo)
execname = modinfo->info->name;
}
-struct frrmod_runtime *frrmod_load(const char *spec, const char *dir, char *err,
- size_t err_len)
+/*
+ * If caller wants error strings, it should define non-NULL pFerrlog
+ * which will be called with 0-terminated error messages. These
+ * messages will NOT contain newlines, and the (*pFerrlog)() function
+ * could be called multiple times for a single call to frrmod_load().
+ *
+ * The (*pFerrlog)() function may copy these strings if needed, but
+ * should expect them to be freed by frrmod_load() before frrmod_load()
+ * returns.
+ *
+ * frrmod_load() is coded such that (*pFerrlog)() will be called only
+ * in the case where frrmod_load() returns an error.
+ */
+struct frrmod_runtime *frrmod_load(const char *spec, const char *dir,
+ void (*pFerrlog)(const void *, const char *),
+ const void *pErrlogCookie)
{
void *handle = NULL;
char name[PATH_MAX], fullpath[PATH_MAX * 2], *args;
struct frrmod_runtime *rtinfo, **rtinfop;
const struct frrmod_info *info;
+#define FRRMOD_LOAD_N_ERRSTR 10
+ char *aErr[FRRMOD_LOAD_N_ERRSTR];
+ unsigned int iErr = 0;
+
+ memset(aErr, 0, sizeof(aErr));
+
+#define ERR_RECORD(...) \
+ do { \
+ if (pFerrlog && (iErr < FRRMOD_LOAD_N_ERRSTR)) { \
+ aErr[iErr++] = asprintfrr(MTYPE_MODULE_LOAD_ERR, \
+ __VA_ARGS__); \
+ } \
+ } while (0)
+
+#define ERR_REPORT \
+ do { \
+ if (pFerrlog) { \
+ unsigned int i; \
+ \
+ for (i = 0; i < iErr; ++i) { \
+ (*pFerrlog)(pErrlogCookie, aErr[i]); \
+ } \
+ } \
+ } while (0)
+
+#define ERR_FREE \
+ do { \
+ unsigned int i; \
+ \
+ for (i = 0; i < iErr; ++i) { \
+ XFREE(MTYPE_MODULE_LOAD_ERR, aErr[i]); \
+ aErr[i] = 0; \
+ } \
+ iErr = 0; \
+ } while (0)
+
snprintf(name, sizeof(name), "%s", spec);
args = strchr(name, ':');
if (args)
@@ -85,32 +137,41 @@ struct frrmod_runtime *frrmod_load(const char *spec, const char *dir, char *err,
snprintf(fullpath, sizeof(fullpath), "%s/%s_%s.so", dir,
execname, name);
handle = dlopen(fullpath, RTLD_NOW | RTLD_GLOBAL);
+ if (!handle)
+ ERR_RECORD("loader error: dlopen(%s): %s",
+ fullpath, dlerror());
}
if (!handle) {
snprintf(fullpath, sizeof(fullpath), "%s/%s.so", dir,
name);
handle = dlopen(fullpath, RTLD_NOW | RTLD_GLOBAL);
+ if (!handle)
+ ERR_RECORD("loader error: dlopen(%s): %s",
+ fullpath, dlerror());
}
}
if (!handle) {
snprintf(fullpath, sizeof(fullpath), "%s", name);
handle = dlopen(fullpath, RTLD_NOW | RTLD_GLOBAL);
+ if (!handle)
+ ERR_RECORD("loader error: dlopen(%s): %s", fullpath,
+ dlerror());
}
if (!handle) {
- if (err)
- snprintf(err, err_len,
- "loading module \"%s\" failed: %s", name,
- dlerror());
+ ERR_REPORT;
+ ERR_FREE;
return NULL;
}
+ /* previous dlopen() errors are no longer relevant */
+ ERR_FREE;
+
rtinfop = dlsym(handle, "frr_module");
if (!rtinfop) {
dlclose(handle);
- if (err)
- snprintf(err, err_len,
- "\"%s\" is not an FRR module: %s", name,
- dlerror());
+ ERR_RECORD("\"%s\" is not an FRR module: %s", name, dlerror());
+ ERR_REPORT;
+ ERR_FREE;
return NULL;
}
rtinfo = *rtinfop;
@@ -122,17 +183,13 @@ struct frrmod_runtime *frrmod_load(const char *spec, const char *dir, char *err,
if (rtinfo->finished_loading) {
dlclose(handle);
- if (err)
- snprintf(err, err_len, "module \"%s\" already loaded",
- name);
+ ERR_RECORD("module \"%s\" already loaded", name);
goto out_fail;
}
if (info->init && info->init()) {
dlclose(handle);
- if (err)
- snprintf(err, err_len,
- "module \"%s\" initialisation failed", name);
+ ERR_RECORD("module \"%s\" initialisation failed", name);
goto out_fail;
}
@@ -140,11 +197,14 @@ struct frrmod_runtime *frrmod_load(const char *spec, const char *dir, char *err,
*frrmod_last = rtinfo;
frrmod_last = &rtinfo->next;
+ ERR_FREE;
return rtinfo;
out_fail:
XFREE(MTYPE_MODULE_LOADARGS, rtinfo->load_args);
XFREE(MTYPE_MODULE_LOADNAME, rtinfo->load_name);
+ ERR_REPORT;
+ ERR_FREE;
return NULL;
}
diff --git a/lib/module.h b/lib/module.h
index 6275877cb3..ae1ca2f757 100644
--- a/lib/module.h
+++ b/lib/module.h
@@ -91,7 +91,9 @@ extern struct frrmod_runtime *frrmod_list;
extern void frrmod_init(struct frrmod_runtime *modinfo);
extern struct frrmod_runtime *frrmod_load(const char *spec, const char *dir,
- char *err, size_t err_len);
+ void (*pFerrlog)(const void *,
+ const char *),
+ const void *pErrlogCookie);
#if 0
/* not implemented yet */
extern void frrmod_unload(struct frrmod_runtime *module);
diff --git a/lib/northbound_grpc.cpp b/lib/northbound_grpc.cpp
index 71f07dfe86..e227d0385c 100644
--- a/lib/northbound_grpc.cpp
+++ b/lib/northbound_grpc.cpp
@@ -344,6 +344,10 @@ static struct lyd_node *get_dnode_config(const std::string &path)
{
struct lyd_node *dnode;
+ if (!yang_dnode_exists(running_config->dnode,
+ path.empty() ? NULL : path.c_str()))
+ return NULL;
+
dnode = yang_dnode_get(running_config->dnode,
path.empty() ? NULL : path.c_str());
if (dnode)
diff --git a/nhrpd/netlink_arp.c b/nhrpd/netlink_arp.c
index 5fcb311888..0a618056d5 100644
--- a/nhrpd/netlink_arp.c
+++ b/nhrpd/netlink_arp.c
@@ -107,7 +107,6 @@ static int netlink_log_recv(struct thread *t)
struct zbuf payload, zb;
struct nlmsghdr *n;
- netlink_log_thread = NULL;
zbuf_init(&zb, buf, sizeof(buf), 0);
while (zbuf_recv(&zb, fd) > 0) {
diff --git a/nhrpd/nhrp_event.c b/nhrpd/nhrp_event.c
index f784ef22d6..206b2caccf 100644
--- a/nhrpd/nhrp_event.c
+++ b/nhrpd/nhrp_event.c
@@ -84,7 +84,6 @@ static int evmgr_read(struct thread *t)
struct zbuf *ibuf = &evmgr->ibuf;
struct zbuf msg;
- evmgr->t_read = NULL;
if (zbuf_read(ibuf, evmgr->fd, (size_t)-1) < 0) {
evmgr_connection_error(evmgr);
return 0;
@@ -103,7 +102,6 @@ static int evmgr_write(struct thread *t)
struct event_manager *evmgr = THREAD_ARG(t);
int r;
- evmgr->t_write = NULL;
r = zbufq_write(&evmgr->obuf, evmgr->fd);
if (r > 0) {
thread_add_write(master, evmgr_write, evmgr, evmgr->fd,
@@ -193,7 +191,6 @@ static int evmgr_reconnect(struct thread *t)
struct event_manager *evmgr = THREAD_ARG(t);
int fd;
- evmgr->t_reconnect = NULL;
if (evmgr->fd >= 0 || !nhrp_event_socket_path)
return 0;
diff --git a/nhrpd/nhrp_multicast.c b/nhrpd/nhrp_multicast.c
index b78afda2c4..339b6dfabe 100644
--- a/nhrpd/nhrp_multicast.c
+++ b/nhrpd/nhrp_multicast.c
@@ -149,7 +149,6 @@ static int netlink_mcast_log_recv(struct thread *t)
struct zbuf payload, zb;
struct nlmsghdr *n;
- netlink_mcast_log_thread = NULL;
zbuf_init(&zb, buf, sizeof(buf), 0);
while (zbuf_recv(&zb, fd) > 0) {
diff --git a/nhrpd/nhrp_nhs.c b/nhrpd/nhrp_nhs.c
index 9dfaf073d8..5179f15ebf 100644
--- a/nhrpd/nhrp_nhs.c
+++ b/nhrpd/nhrp_nhs.c
@@ -112,7 +112,6 @@ static int nhrp_reg_timeout(struct thread *t)
struct nhrp_registration *r = THREAD_ARG(t);
struct nhrp_cache *c;
- r->t_register = NULL;
if (r->timeout >= 16 && sockunion_family(&r->proto_addr) != AF_UNSPEC) {
nhrp_reqid_free(&nhrp_packet_reqid, &r->reqid);
@@ -176,7 +175,6 @@ static int nhrp_reg_send_req(struct thread *t)
struct nhrp_extension_header *ext;
struct nhrp_cie_header *cie;
- r->t_register = NULL;
if (!nhrp_peer_check(r->peer, 2)) {
debugf(NHRP_DEBUG_COMMON, "NHS: Waiting link for %pSU",
&r->peer->vc->remote.nbma);
@@ -281,7 +279,6 @@ static void nhrp_nhs_resolve_cb(struct resolver_query *q, const char *errstr,
struct nhrp_registration *reg, *regn;
int i;
- nhs->t_resolve = NULL;
if (n < 0) {
/* Failed, retry in a moment */
thread_add_timer(master, nhrp_nhs_resolve, nhs, 5,
diff --git a/nhrpd/nhrp_peer.c b/nhrpd/nhrp_peer.c
index 5a7da703ac..030f4c0ff3 100644
--- a/nhrpd/nhrp_peer.c
+++ b/nhrpd/nhrp_peer.c
@@ -265,7 +265,6 @@ static int nhrp_peer_request_timeout(struct thread *t)
struct interface *ifp = p->ifp;
struct nhrp_interface *nifp = ifp->info;
- p->t_fallback = NULL;
if (p->online)
return 0;
diff --git a/nhrpd/nhrp_shortcut.c b/nhrpd/nhrp_shortcut.c
index 0905ceb72a..244273cd58 100644
--- a/nhrpd/nhrp_shortcut.c
+++ b/nhrpd/nhrp_shortcut.c
@@ -39,7 +39,6 @@ static int nhrp_shortcut_do_expire(struct thread *t)
{
struct nhrp_shortcut *s = THREAD_ARG(t);
- s->t_timer = NULL;
thread_add_timer(master, nhrp_shortcut_do_purge, s, s->holding_time / 3,
&s->t_timer);
s->expiring = 1;
diff --git a/nhrpd/vici.c b/nhrpd/vici.c
index c21e01601c..8fce828663 100644
--- a/nhrpd/vici.c
+++ b/nhrpd/vici.c
@@ -361,7 +361,6 @@ static int vici_read(struct thread *t)
struct zbuf *ibuf = &vici->ibuf;
struct zbuf pktbuf;
- vici->t_read = NULL;
if (zbuf_read(ibuf, vici->fd, (size_t)-1) < 0) {
vici_connection_error(vici);
return 0;
@@ -392,7 +391,6 @@ static int vici_write(struct thread *t)
struct vici_conn *vici = THREAD_ARG(t);
int r;
- vici->t_write = NULL;
r = zbufq_write(&vici->obuf, vici->fd);
if (r > 0) {
thread_add_write(master, vici_write, vici, vici->fd,
@@ -509,7 +507,6 @@ static int vici_reconnect(struct thread *t)
int fd;
char *file_path;
- vici->t_reconnect = NULL;
if (vici->fd >= 0)
return 0;
diff --git a/ospf6d/ospf6_asbr.c b/ospf6d/ospf6_asbr.c
index c5ee22bc5e..733f4ba1fb 100644
--- a/ospf6d/ospf6_asbr.c
+++ b/ospf6d/ospf6_asbr.c
@@ -1134,7 +1134,6 @@ void ospf6_asbr_distribute_list_update(struct ospf6 *ospf6,
if (IS_OSPF6_DEBUG_ASBR)
zlog_debug("%s: trigger redistribute reset thread", __func__);
- ospf6->t_distribute_update = NULL;
thread_add_timer_msec(master, ospf6_asbr_routemap_update_timer, ospf6,
OSPF_MIN_LS_INTERVAL,
&ospf6->t_distribute_update);
diff --git a/ospf6d/ospf6_flood.c b/ospf6d/ospf6_flood.c
index 0c004b85af..150903a56a 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,
@@ -547,7 +546,6 @@ void ospf6_flood_interface(struct ospf6_neighbor *from, struct ospf6_lsa *lsa,
/* reschedule retransmissions to all neighbors */
for (ALL_LIST_ELEMENTS(oi->neighbor_list, node, nnode, on)) {
THREAD_OFF(on->thread_send_lsupdate);
- on->thread_send_lsupdate = NULL;
thread_add_event(master, ospf6_lsupdate_send_neighbor,
on, 0, &on->thread_send_lsupdate);
}
@@ -1028,15 +1026,8 @@ void ospf6_receive_lsa(struct ospf6_neighbor *from,
if (old)
ospf6_flood_clear(old);
- /* (b) immediately flood and (c) remove from all retrans-list */
- /* Prevent self-originated LSA to be flooded. this is to make
- reoriginated instance of the LSA not to be rejected by other
- routers
- due to MinLSArrival. */
self_originated = (new->header->adv_router
== from->ospf6_if->area->ospf6->router_id);
- if (!self_originated)
- ospf6_flood(from, new);
/* Received non-self-originated Grace LSA. */
if (IS_GRACE_LSA(new) && !self_originated) {
@@ -1082,6 +1073,14 @@ void ospf6_receive_lsa(struct ospf6_neighbor *from,
}
}
+ /* (b) immediately flood and (c) remove from all retrans-list */
+ /* Prevent self-originated LSA to be flooded. this is to make
+ * reoriginated instance of the LSA not to be rejected by other
+ * routers due to MinLSArrival.
+ */
+ if (!self_originated)
+ ospf6_flood(from, new);
+
/* (d), installing lsdb, which may cause routing
table calculation (replacing database copy) */
ospf6_install_lsa(new);
@@ -1113,7 +1112,6 @@ void ospf6_receive_lsa(struct ospf6_neighbor *from,
"Newer instance of the self-originated LSA");
zlog_debug("Schedule reorigination");
}
- new->refresh = NULL;
thread_add_event(master, ospf6_lsa_refresh, new, 0,
&new->refresh);
}
diff --git a/ospf6d/ospf6_interface.c b/ospf6d/ospf6_interface.c
index b63a3c02db..a3eb1445f1 100644
--- a/ospf6d/ospf6_interface.c
+++ b/ospf6d/ospf6_interface.c
@@ -819,7 +819,6 @@ int interface_up(struct thread *thread)
/* Schedule Hello */
if (!CHECK_FLAG(oi->flag, OSPF6_INTERFACE_PASSIVE)
&& !if_is_loopback_or_vrf(oi->interface)) {
- oi->thread_send_hello = NULL;
thread_add_event(master, ospf6_hello_send, oi, 0,
&oi->thread_send_hello);
}
diff --git a/ospf6d/ospf6_lsa.c b/ospf6d/ospf6_lsa.c
index ac07704d2c..f406e828e1 100644
--- a/ospf6d/ospf6_lsa.c
+++ b/ospf6d/ospf6_lsa.c
@@ -891,7 +891,6 @@ int ospf6_lsa_refresh(struct thread *thread)
new = ospf6_lsa_create(self->header);
new->lsdb = old->lsdb;
- new->refresh = NULL;
thread_add_timer(master, ospf6_lsa_refresh, new, OSPF_LS_REFRESH_TIME,
&new->refresh);
diff --git a/ospf6d/ospf6_message.c b/ospf6d/ospf6_message.c
index 23610f649d..a81c3e728f 100644
--- a/ospf6d/ospf6_message.c
+++ b/ospf6d/ospf6_message.c
@@ -774,7 +774,6 @@ static void ospf6_dbdesc_recv_master(struct ospf6_header *oh,
&& !CHECK_FLAG(on->dbdesc_bits, OSPF6_DBDESC_MBIT))
thread_add_event(master, exchange_done, on, 0, NULL);
else {
- on->thread_send_dbdesc = NULL;
thread_add_event(master, ospf6_dbdesc_send_newone, on, 0,
&on->thread_send_dbdesc);
}
@@ -855,7 +854,6 @@ static void ospf6_dbdesc_recv_slave(struct ospf6_header *oh,
zlog_debug(
"Duplicated dbdesc causes retransmit");
THREAD_OFF(on->thread_send_dbdesc);
- on->thread_send_dbdesc = NULL;
thread_add_event(master, ospf6_dbdesc_send, on, 0,
&on->thread_send_dbdesc);
return;
@@ -2395,7 +2393,6 @@ int ospf6_lsreq_send(struct thread *thread)
/* set next thread */
if (on->request_list->count != 0) {
- on->thread_send_lsreq = NULL;
thread_add_timer(master, ospf6_lsreq_send, on,
on->ospf6_if->rxmt_interval,
&on->thread_send_lsreq);
@@ -2581,11 +2578,9 @@ int ospf6_lsupdate_send_neighbor(struct thread *thread)
ospf6_packet_free(op);
if (on->lsupdate_list->count != 0) {
- on->thread_send_lsupdate = NULL;
thread_add_event(master, ospf6_lsupdate_send_neighbor, on, 0,
&on->thread_send_lsupdate);
} else if (on->retrans_list->count != 0) {
- on->thread_send_lsupdate = NULL;
thread_add_timer(master, ospf6_lsupdate_send_neighbor, on,
on->ospf6_if->rxmt_interval,
&on->thread_send_lsupdate);
@@ -2699,7 +2694,6 @@ int ospf6_lsupdate_send_interface(struct thread *thread)
ospf6_packet_free(op);
if (oi->lsupdate_list->count > 0) {
- oi->thread_send_lsupdate = NULL;
thread_add_event(master, ospf6_lsupdate_send_interface, oi, 0,
&oi->thread_send_lsupdate);
}
diff --git a/ospf6d/ospf6_neighbor.c b/ospf6d/ospf6_neighbor.c
index 35fbd3991c..6f2795a56d 100644
--- a/ospf6d/ospf6_neighbor.c
+++ b/ospf6d/ospf6_neighbor.c
@@ -273,7 +273,6 @@ int hello_received(struct thread *thread)
/* reset Inactivity Timer */
THREAD_OFF(on->inactivity_timer);
- on->inactivity_timer = NULL;
thread_add_timer(master, inactivity_timer, on,
on->ospf6_if->dead_interval, &on->inactivity_timer);
@@ -312,7 +311,6 @@ int twoway_received(struct thread *thread)
SET_FLAG(on->dbdesc_bits, OSPF6_DBDESC_IBIT);
THREAD_OFF(on->thread_send_dbdesc);
- on->thread_send_dbdesc = NULL;
thread_add_event(master, ospf6_dbdesc_send, on, 0,
&on->thread_send_dbdesc);
@@ -438,7 +436,6 @@ void ospf6_check_nbr_loading(struct ospf6_neighbor *on)
else if (on->last_ls_req == NULL) {
if (on->thread_send_lsreq != NULL)
THREAD_OFF(on->thread_send_lsreq);
- on->thread_send_lsreq = NULL;
thread_add_event(master, ospf6_lsreq_send, on, 0,
&on->thread_send_lsreq);
}
@@ -620,7 +617,6 @@ int inactivity_timer(struct thread *thread)
if (IS_OSPF6_DEBUG_NEIGHBOR(EVENT))
zlog_debug("Neighbor Event %s: *InactivityTimer*", on->name);
- on->inactivity_timer = NULL;
on->drouter = on->prev_drouter = 0;
on->bdrouter = on->prev_bdrouter = 0;
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/ospfd/ospf_gr_helper.c b/ospfd/ospf_gr_helper.c
index 11ad45d30f..b3eaf7bbdb 100644
--- a/ospfd/ospf_gr_helper.c
+++ b/ospfd/ospf_gr_helper.c
@@ -723,14 +723,10 @@ void ospf_gr_helper_exit(struct ospf_neighbor *nbr,
/* check exit triggered due to successful completion
* of graceful restart.
- * If no, bring down the neighbour.
*/
if (reason != OSPF_GR_HELPER_COMPLETED) {
if (IS_DEBUG_OSPF_GR)
- zlog_debug(
- "%s, Failed GR exit, so bringing down the neighbour",
- __func__);
- OSPF_NSM_EVENT_SCHEDULE(nbr, NSM_KillNbr);
+ zlog_debug("%s, Unsuccessful GR exit", __func__);
}
/*Recalculate the DR for the network segment */
diff --git a/ospfd/ospf_nsm.c b/ospfd/ospf_nsm.c
index 268fb81e52..dee25275d6 100644
--- a/ospfd/ospf_nsm.c
+++ b/ospfd/ospf_nsm.c
@@ -76,10 +76,13 @@ static int ospf_inactivity_timer(struct thread *thread)
*/
if (!OSPF_GR_IS_ACTIVE_HELPER(nbr))
OSPF_NSM_EVENT_SCHEDULE(nbr, NSM_InactivityTimer);
- else if (IS_DEBUG_OSPF_GR)
+ else if (IS_DEBUG_OSPF_GR) {
zlog_debug(
- "%s, Acting as HELPER for this neighbour, So inactivitytimer event will not be fired.",
+ "%s, Acting as HELPER for this neighbour, So restart the dead timer",
__func__);
+ OSPF_NSM_TIMER_ON(nbr->t_inactivity, ospf_inactivity_timer,
+ nbr->v_inactivity);
+ }
return 0;
}
diff --git a/pimd/pim_igmp.c b/pimd/pim_igmp.c
index 50de7124d2..795c96c838 100644
--- a/pimd/pim_igmp.c
+++ b/pimd/pim_igmp.c
@@ -671,7 +671,6 @@ void pim_igmp_general_query_on(struct igmp_sock *igmp)
ifaddr_str, query_interval,
startup_mode ? "startup" : "non-startup", igmp->fd);
}
- igmp->t_igmp_query_timer = NULL;
thread_add_timer(router->master, pim_igmp_general_query, igmp,
query_interval, &igmp->t_igmp_query_timer);
}
@@ -1052,7 +1051,6 @@ static void igmp_read_on(struct igmp_sock *igmp)
zlog_debug("Scheduling READ event on IGMP socket fd=%d",
igmp->fd);
}
- igmp->t_igmp_read = NULL;
thread_add_read(router->master, pim_igmp_read, igmp, igmp->fd,
&igmp->t_igmp_read);
}
diff --git a/pimd/pim_msdp_socket.c b/pimd/pim_msdp_socket.c
index 78a8265a1c..5fff9fca0e 100644
--- a/pimd/pim_msdp_socket.c
+++ b/pimd/pim_msdp_socket.c
@@ -205,7 +205,6 @@ int pim_msdp_sock_listen(struct pim_instance *pim)
/* add accept thread */
listener->fd = sock;
memcpy(&listener->su, &sin, socklen);
- listener->thread = NULL;
thread_add_read(pim->msdp.master, pim_msdp_sock_accept, pim, sock,
&listener->thread);
diff --git a/pimd/pim_pim.c b/pimd/pim_pim.c
index 8c38cf6c4c..3df7dc41ce 100644
--- a/pimd/pim_pim.c
+++ b/pimd/pim_pim.c
@@ -415,7 +415,6 @@ static void pim_sock_read_on(struct interface *ifp)
zlog_debug("Scheduling READ event on PIM socket fd=%d",
pim_ifp->pim_sock_fd);
}
- pim_ifp->t_pim_sock_read = NULL;
thread_add_read(router->master, pim_sock_read, ifp,
pim_ifp->pim_sock_fd, &pim_ifp->t_pim_sock_read);
}
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/ripd/rip_interface.c b/ripd/rip_interface.c
index a2c86e3b22..2eb7bb6da1 100644
--- a/ripd/rip_interface.c
+++ b/ripd/rip_interface.c
@@ -805,7 +805,6 @@ static int rip_interface_wakeup(struct thread *t)
ifp = THREAD_ARG(t);
ri = ifp->info;
- ri->t_wakeup = NULL;
/* Join to multicast group. */
if (rip_multicast_join(ifp, ri->rip->sock) < 0) {
diff --git a/ripd/rip_peer.c b/ripd/rip_peer.c
index 63493e2539..12c4edd436 100644
--- a/ripd/rip_peer.c
+++ b/ripd/rip_peer.c
@@ -95,7 +95,6 @@ static struct rip_peer *rip_peer_get(struct rip *rip, struct in_addr *addr)
}
/* Update timeout thread. */
- peer->t_timeout = NULL;
thread_add_timer(master, rip_peer_timeout, peer, RIP_PEER_TIMER_DEFAULT,
&peer->t_timeout);
diff --git a/ripd/ripd.c b/ripd/ripd.c
index 84fb67956e..145b4de0a0 100644
--- a/ripd/ripd.c
+++ b/ripd/ripd.c
@@ -142,7 +142,6 @@ static int rip_garbage_collect(struct thread *t)
struct route_node *rp;
rinfo = THREAD_ARG(t);
- rinfo->t_garbage_collect = NULL;
/* Off timeout timer. */
RIP_TIMER_OFF(rinfo->t_timeout);
@@ -1744,7 +1743,6 @@ static int rip_read(struct thread *t)
/* Fetch socket then register myself. */
sock = THREAD_FD(t);
- rip->t_read = NULL;
/* Add myself to tne next event */
rip_event(rip, RIP_READ, sock);
@@ -2545,9 +2543,6 @@ static int rip_update(struct thread *t)
{
struct rip *rip = THREAD_ARG(t);
- /* Clear timer pointer. */
- rip->t_update = NULL;
-
if (IS_RIP_DEBUG_EVENT)
zlog_debug("update timer fire!");
@@ -2588,8 +2583,6 @@ static int rip_triggered_interval(struct thread *t)
{
struct rip *rip = THREAD_ARG(t);
- rip->t_triggered_interval = NULL;
-
if (rip->trigger) {
rip->trigger = 0;
rip_triggered_update(t);
@@ -2603,9 +2596,6 @@ static int rip_triggered_update(struct thread *t)
struct rip *rip = THREAD_ARG(t);
int interval;
- /* Clear thred pointer. */
- rip->t_triggered_update = NULL;
-
/* Cancel interval timer. */
RIP_TIMER_OFF(rip->t_triggered_interval);
rip->trigger = 0;
@@ -2628,7 +2618,6 @@ static int rip_triggered_update(struct thread *t)
update is triggered when the timer expires. */
interval = (frr_weak_random() % 5) + 1;
- rip->t_triggered_interval = NULL;
thread_add_timer(master, rip_triggered_interval, rip, interval,
&rip->t_triggered_interval);
@@ -2834,7 +2823,6 @@ void rip_event(struct rip *rip, enum rip_event event, int sock)
switch (event) {
case RIP_READ:
- rip->t_read = NULL;
thread_add_read(master, rip_read, rip, sock, &rip->t_read);
break;
case RIP_UPDATE_EVENT:
diff --git a/ripngd/ripng_interface.c b/ripngd/ripng_interface.c
index f374fcb839..7b5e7604d2 100644
--- a/ripngd/ripng_interface.c
+++ b/ripngd/ripng_interface.c
@@ -618,7 +618,6 @@ static int ripng_interface_wakeup(struct thread *t)
ifp = THREAD_ARG(t);
ri = ifp->info;
- ri->t_wakeup = NULL;
/* Join to multicast group. */
if (ripng_multicast_join(ifp, ri->ripng->sock) < 0) {
diff --git a/ripngd/ripngd.c b/ripngd/ripngd.c
index 4f5c8e7760..86abf1eead 100644
--- a/ripngd/ripngd.c
+++ b/ripngd/ripngd.c
@@ -429,7 +429,6 @@ static int ripng_garbage_collect(struct thread *t)
struct agg_node *rp;
rinfo = THREAD_ARG(t);
- rinfo->t_garbage_collect = NULL;
/* Off timeout timer. */
RIPNG_TIMER_OFF(rinfo->t_timeout);
@@ -1320,7 +1319,6 @@ static int ripng_read(struct thread *thread)
/* Fetch thread data and set read pointer to empty for event
managing. `sock' sould be same as ripng->sock. */
sock = THREAD_FD(thread);
- ripng->t_read = NULL;
/* Add myself to the next event. */
ripng_event(ripng, RIPNG_READ, sock);
@@ -1418,9 +1416,6 @@ static int ripng_update(struct thread *t)
struct interface *ifp;
struct ripng_interface *ri;
- /* Clear update timer thread. */
- ripng->t_update = NULL;
-
/* Logging update event. */
if (IS_RIPNG_DEBUG_EVENT)
zlog_debug("RIPng update timer expired!");
@@ -1469,8 +1464,6 @@ static int ripng_triggered_interval(struct thread *t)
{
struct ripng *ripng = THREAD_ARG(t);
- ripng->t_triggered_interval = NULL;
-
if (ripng->trigger) {
ripng->trigger = 0;
ripng_triggered_update(t);
@@ -1486,8 +1479,6 @@ int ripng_triggered_update(struct thread *t)
struct ripng_interface *ri;
int interval;
- ripng->t_triggered_update = NULL;
-
/* Cancel interval timer. */
thread_cancel(&ripng->t_triggered_interval);
ripng->trigger = 0;
@@ -1525,7 +1516,6 @@ int ripng_triggered_update(struct thread *t)
update is triggered when the timer expires. */
interval = (frr_weak_random() % 5) + 1;
- ripng->t_triggered_interval = NULL;
thread_add_timer(master, ripng_triggered_interval, ripng, interval,
&ripng->t_triggered_interval);
@@ -1942,7 +1932,6 @@ void ripng_event(struct ripng *ripng, enum ripng_event event, int sock)
/* Update timer jitter. */
jitter = ripng_update_jitter(ripng->update_time);
- ripng->t_update = NULL;
thread_add_timer(master, ripng_update, ripng,
sock ? 2 : ripng->update_time + jitter,
&ripng->t_update);
diff --git a/ripngd/ripngd.h b/ripngd/ripngd.h
index 12e5a6d4ac..6bf687b02a 100644
--- a/ripngd/ripngd.h
+++ b/ripngd/ripngd.h
@@ -137,10 +137,7 @@ struct ripng {
/* RIPng threads. */
struct thread *t_read;
- struct thread *t_write;
struct thread *t_update;
- struct thread *t_garbage;
- struct thread *t_zebra;
/* Triggered update hack. */
int trigger;
diff --git a/tests/lib/test_grpc.cpp b/tests/lib/test_grpc.cpp
index 491796802a..0aa1bbb7e1 100644
--- a/tests/lib/test_grpc.cpp
+++ b/tests/lib/test_grpc.cpp
@@ -81,11 +81,16 @@ static const struct frr_yang_module_info *const staticd_yang_modules[] = {
static int grpc_thread_stop(struct thread *thread);
+static void _err_print(const void *cookie, const char *errstr)
+{
+ std::cout << "Failed to load grpc module:" << errstr << std::endl;
+}
+
static void static_startup(void)
{
// struct frrmod_runtime module;
// static struct option_chain *oc;
- char moderr[256] = {};
+
cmd_init(1);
zlog_aux_init("NONE: ", LOG_DEBUG);
@@ -94,17 +99,14 @@ static void static_startup(void)
/* Load the server side module -- check libtool path first */
std::string modpath = std::string(binpath) + std::string("../../../lib/.libs");
- grpc_module = frrmod_load("grpc:50051", modpath.c_str(), moderr, sizeof(moderr));
+ grpc_module = frrmod_load("grpc:50051", modpath.c_str(), 0, 0);
if (!grpc_module) {
modpath = std::string(binpath) + std::string("../../lib");
- grpc_module = frrmod_load("grpc:50051", modpath.c_str(), moderr,
- sizeof(moderr));
+ grpc_module = frrmod_load("grpc:50051", modpath.c_str(),
+ _err_print, 0);
}
- if (!grpc_module) {
- std::cout << "Failed to load grpc module:" << moderr
- << std::endl;
+ if (!grpc_module)
exit(1);
- }
static_debug_init();
diff --git a/tests/lib/test_timer_correctness.c b/tests/lib/test_timer_correctness.c
index 416ea39772..0ae9761b11 100644
--- a/tests/lib/test_timer_correctness.c
+++ b/tests/lib/test_timer_correctness.c
@@ -134,7 +134,6 @@ int main(int argc, char **argv)
/* Schedule timers to expire in 0..5 seconds */
interval_msec = prng_rand(prng) % 5000;
arg = XMALLOC(MTYPE_TMP, TIMESTR_LEN + 1);
- timers[i] = NULL;
thread_add_timer_msec(master, timer_func, arg, interval_msec,
&timers[i]);
ret = snprintf(arg, TIMESTR_LEN + 1, "%lld.%06lld",
diff --git a/tests/lib/test_timer_performance.c b/tests/lib/test_timer_performance.c
index 45b29b92b1..23c044c7c1 100644
--- a/tests/lib/test_timer_performance.c
+++ b/tests/lib/test_timer_performance.c
@@ -55,7 +55,6 @@ int main(int argc, char **argv)
/* create thread structures so they won't be allocated during the
* time measurement */
for (i = 0; i < SCHEDULE_TIMERS; i++) {
- timers[i] = NULL;
thread_add_timer_msec(master, dummy_func, NULL, 0, &timers[i]);
}
for (i = 0; i < SCHEDULE_TIMERS; i++)
@@ -67,7 +66,6 @@ int main(int argc, char **argv)
long interval_msec;
interval_msec = prng_rand(prng) % (100 * SCHEDULE_TIMERS);
- timers[i] = NULL;
thread_add_timer_msec(master, dummy_func, NULL, interval_msec,
&timers[i]);
}
diff --git a/tests/topotests/bfd_ospf_topo1/rt1/ospf6d.conf b/tests/topotests/bfd_ospf_topo1/rt1/ospf6d.conf
index 18def599b4..98da8c2619 100644
--- a/tests/topotests/bfd_ospf_topo1/rt1/ospf6d.conf
+++ b/tests/topotests/bfd_ospf_topo1/rt1/ospf6d.conf
@@ -6,10 +6,14 @@ hostname rt1
password 1
!
interface eth-rt2
+ ipv6 ospf6 hello-interval 2
+ ipv6 ospf6 dead-interval 8
ipv6 ospf6 network broadcast
ipv6 ospf6 bfd
!
interface eth-rt3
+ ipv6 ospf6 hello-interval 2
+ ipv6 ospf6 dead-interval 8
ipv6 ospf6 network broadcast
ipv6 ospf6 bfd
!
diff --git a/tests/topotests/bfd_ospf_topo1/rt1/ospfd.conf b/tests/topotests/bfd_ospf_topo1/rt1/ospfd.conf
index 07b42f9885..9da8765005 100644
--- a/tests/topotests/bfd_ospf_topo1/rt1/ospfd.conf
+++ b/tests/topotests/bfd_ospf_topo1/rt1/ospfd.conf
@@ -10,13 +10,19 @@ debug ospf zebra
!
interface lo
ip ospf area 0.0.0.0
+ ip ospf hello-interval 2
+ ip ospf dead-interval 8
!
interface eth-rt2
ip ospf area 0.0.0.0
+ ip ospf hello-interval 2
+ ip ospf dead-interval 8
ip ospf bfd
!
interface eth-rt3
ip ospf area 0.0.0.0
+ ip ospf hello-interval 2
+ ip ospf dead-interval 8
ip ospf bfd
!
router ospf
diff --git a/tests/topotests/bfd_ospf_topo1/rt2/ospf6d.conf b/tests/topotests/bfd_ospf_topo1/rt2/ospf6d.conf
index 2f35099564..34b0902094 100644
--- a/tests/topotests/bfd_ospf_topo1/rt2/ospf6d.conf
+++ b/tests/topotests/bfd_ospf_topo1/rt2/ospf6d.conf
@@ -5,10 +5,14 @@ hostname rt2
password 1
!
interface eth-rt1
+ ipv6 ospf6 hello-interval 2
+ ipv6 ospf6 dead-interval 8
ipv6 ospf6 network broadcast
ipv6 ospf6 bfd
!
interface eth-rt5
+ ipv6 ospf6 hello-interval 2
+ ipv6 ospf6 dead-interval 8
ipv6 ospf6 network broadcast
!
router ospf6
diff --git a/tests/topotests/bfd_ospf_topo1/rt2/ospfd.conf b/tests/topotests/bfd_ospf_topo1/rt2/ospfd.conf
index a05d8b58c8..11be6a14b2 100644
--- a/tests/topotests/bfd_ospf_topo1/rt2/ospfd.conf
+++ b/tests/topotests/bfd_ospf_topo1/rt2/ospfd.conf
@@ -9,13 +9,19 @@ debug ospf zebra
!
interface lo
ip ospf area 0.0.0.0
+ ip ospf hello-interval 2
+ ip ospf dead-interval 8
!
interface eth-rt1
ip ospf area 0.0.0.0
+ ip ospf hello-interval 2
+ ip ospf dead-interval 8
ip ospf bfd
!
interface eth-rt5
ip ospf area 0.0.0.0
+ ip ospf hello-interval 2
+ ip ospf dead-interval 8
!
router ospf
ospf router-id 2.2.2.2
diff --git a/tests/topotests/bfd_ospf_topo1/rt3/ospf6d.conf b/tests/topotests/bfd_ospf_topo1/rt3/ospf6d.conf
index 3e8777019e..8ab4eee1d3 100644
--- a/tests/topotests/bfd_ospf_topo1/rt3/ospf6d.conf
+++ b/tests/topotests/bfd_ospf_topo1/rt3/ospf6d.conf
@@ -5,10 +5,14 @@ hostname rt3
password 1
!
interface eth-rt1
+ ipv6 ospf6 hello-interval 2
+ ipv6 ospf6 dead-interval 8
ipv6 ospf6 network broadcast
ipv6 ospf6 bfd
!
interface eth-rt4
+ ipv6 ospf6 hello-interval 2
+ ipv6 ospf6 dead-interval 8
ipv6 ospf6 network broadcast
!
router ospf6
diff --git a/tests/topotests/bfd_ospf_topo1/rt3/ospfd.conf b/tests/topotests/bfd_ospf_topo1/rt3/ospfd.conf
index 1196e6d189..acc54b3866 100644
--- a/tests/topotests/bfd_ospf_topo1/rt3/ospfd.conf
+++ b/tests/topotests/bfd_ospf_topo1/rt3/ospfd.conf
@@ -9,13 +9,19 @@ debug ospf zebra
!
interface lo
ip ospf area 0.0.0.0
+ ip ospf hello-interval 2
+ ip ospf dead-interval 8
!
interface eth-rt1
ip ospf area 0.0.0.0
+ ip ospf hello-interval 2
+ ip ospf dead-interval 8
ip ospf bfd
!
interface eth-rt4
ip ospf area 0.0.0.0
+ ip ospf hello-interval 2
+ ip ospf dead-interval 8
!
router ospf
ospf router-id 3.3.3.3
diff --git a/tests/topotests/bfd_ospf_topo1/rt4/ospf6d.conf b/tests/topotests/bfd_ospf_topo1/rt4/ospf6d.conf
index bccd1e75bd..138b688140 100644
--- a/tests/topotests/bfd_ospf_topo1/rt4/ospf6d.conf
+++ b/tests/topotests/bfd_ospf_topo1/rt4/ospf6d.conf
@@ -5,9 +5,13 @@ hostname rt4
password 1
!
interface eth-rt3
+ ipv6 ospf6 hello-interval 2
+ ipv6 ospf6 dead-interval 8
ipv6 ospf6 network broadcast
!
interface eth-rt5
+ ipv6 ospf6 hello-interval 2
+ ipv6 ospf6 dead-interval 8
ipv6 ospf6 network broadcast
!
router ospf6
diff --git a/tests/topotests/bfd_ospf_topo1/rt4/ospfd.conf b/tests/topotests/bfd_ospf_topo1/rt4/ospfd.conf
index 3a2568b4ab..670e56ccc8 100644
--- a/tests/topotests/bfd_ospf_topo1/rt4/ospfd.conf
+++ b/tests/topotests/bfd_ospf_topo1/rt4/ospfd.conf
@@ -9,12 +9,18 @@ debug ospf zebra
!
interface lo
ip ospf area 0.0.0.0
+ ip ospf hello-interval 2
+ ip ospf dead-interval 8
!
interface eth-rt3
ip ospf area 0.0.0.0
+ ip ospf hello-interval 2
+ ip ospf dead-interval 8
!
interface eth-rt5
ip ospf area 0.0.0.0
+ ip ospf hello-interval 2
+ ip ospf dead-interval 8
!
router ospf
ospf router-id 4.4.4.4
diff --git a/tests/topotests/bfd_ospf_topo1/rt5/ospf6d.conf b/tests/topotests/bfd_ospf_topo1/rt5/ospf6d.conf
index 766862276c..6eb4fe59a8 100644
--- a/tests/topotests/bfd_ospf_topo1/rt5/ospf6d.conf
+++ b/tests/topotests/bfd_ospf_topo1/rt5/ospf6d.conf
@@ -6,9 +6,13 @@ password 1
!
interface eth-rt2
ipv6 ospf6 network broadcast
+ ipv6 ospf6 hello-interval 2
+ ipv6 ospf6 dead-interval 8
!
interface eth-rt4
ipv6 ospf6 network broadcast
+ ipv6 ospf6 hello-interval 2
+ ipv6 ospf6 dead-interval 8
!
router ospf6
ospf6 router-id 5.5.5.5
diff --git a/tests/topotests/bfd_ospf_topo1/rt5/ospfd.conf b/tests/topotests/bfd_ospf_topo1/rt5/ospfd.conf
index a35de5f45f..286de51288 100644
--- a/tests/topotests/bfd_ospf_topo1/rt5/ospfd.conf
+++ b/tests/topotests/bfd_ospf_topo1/rt5/ospfd.conf
@@ -9,12 +9,18 @@ debug ospf zebra
!
interface lo
ip ospf area 0.0.0.0
+ ip ospf hello-interval 2
+ ip ospf dead-interval 8
!
interface eth-rt2
ip ospf area 0.0.0.0
+ ip ospf hello-interval 2
+ ip ospf dead-interval 8
!
interface eth-rt4
ip ospf area 0.0.0.0
+ ip ospf hello-interval 2
+ ip ospf dead-interval 8
!
router ospf
ospf router-id 5.5.5.5
diff --git a/tests/topotests/bfd_ospf_topo1/test_bfd_ospf_topo1.py b/tests/topotests/bfd_ospf_topo1/test_bfd_ospf_topo1.py
index 09b8631740..bef2c3f162 100755
--- a/tests/topotests/bfd_ospf_topo1/test_bfd_ospf_topo1.py
+++ b/tests/topotests/bfd_ospf_topo1/test_bfd_ospf_topo1.py
@@ -132,7 +132,7 @@ def print_cmd_result(rname, command):
print(get_topogen().gears[rname].vtysh_cmd(command, isjson=False))
-def router_compare_json_output(rname, command, reference, count=120, wait=0.5):
+def router_compare_json_output(rname, command, reference, count=40, wait=2):
"Compare router JSON output"
logger.info('Comparing router "%s" "%s" output', rname, command)
@@ -141,7 +141,7 @@ def router_compare_json_output(rname, command, reference, count=120, wait=0.5):
filename = "{}/{}/{}".format(CWD, rname, reference)
expected = json.loads(open(filename).read())
- # Run test function until we get an result. Wait at most 60 seconds.
+ # Run test function until we get an result. Wait at most 80 seconds.
test_func = partial(topotest.router_json_cmp, tgen.gears[rname], command, expected)
_, diff = topotest.run_and_expect(test_func, None, count=count, wait=wait)
assertmsg = '"{}" JSON output mismatches the expected result'.format(rname)
@@ -195,8 +195,8 @@ def test_bfd_ospf_interface_failure_rt2_step3():
# By default BFD provides a recovery time of 900ms plus jitter, so let's wait
# initial 2 seconds to let the CI not suffer.
- # TODO: add check for array size
- sleep(2)
+ topotest.sleep(2, 'Wait for BFD down notification')
+
router_compare_json_output(
"rt1", "show ip route ospf json", "step3/show_ip_route_rt2_down.ref", 1, 0
)
@@ -234,8 +234,7 @@ def test_bfd_ospf_interface_failure_rt3_step3():
# By default BFD provides a recovery time of 900ms plus jitter, so let's wait
# initial 2 seconds to let the CI not suffer.
- # TODO: add check for array size
- sleep(2)
+ topotest.sleep(2, 'Wait for BFD down notification')
router_compare_json_output(
"rt1", "show ip route ospf json", "step3/show_ip_route_rt3_down.ref", 1, 0
)
diff --git a/tests/topotests/bgp_l3vpn_to_bgp_vrf/customize.py b/tests/topotests/bgp_l3vpn_to_bgp_vrf/customize.py
index 8fd344696e..fce8e708f2 100644
--- a/tests/topotests/bgp_l3vpn_to_bgp_vrf/customize.py
+++ b/tests/topotests/bgp_l3vpn_to_bgp_vrf/customize.py
@@ -206,7 +206,7 @@ def ltemplatePreRouterStartHook():
for cmd in cmds:
cc.doCmd(tgen, rtr, cmd.format(rtr))
cc.doCmd(tgen, rtr, "ip link set dev {0}-eth0 master {0}-cust2".format(rtr))
- if cc.getOutput() != 4:
+ if cc.getOutput() != 0:
InitSuccess = False
logger.info(
"Unexpected output seen ({} times, tests will be skipped".format(
@@ -214,6 +214,11 @@ def ltemplatePreRouterStartHook():
)
)
else:
+ rtrs = ["r1", "r3", "r4", "ce4"]
+ for rtr in rtrs:
+ logger.info("{} configured".format(rtr))
+ cc.doCmd(tgen, rtr, "ip -d link show type vrf")
+ cc.doCmd(tgen, rtr, "ip link show")
InitSuccess = True
logger.info("VRF config successful!")
return InitSuccess
diff --git a/tests/topotests/lib/ltemplate.py b/tests/topotests/lib/ltemplate.py
index 910573c14c..c98bfac9ee 100644
--- a/tests/topotests/lib/ltemplate.py
+++ b/tests/topotests/lib/ltemplate.py
@@ -217,6 +217,7 @@ class ltemplateRtrCmd:
self.resetCounts()
def doCmd(self, tgen, rtr, cmd, checkstr=None):
+ logger.info("doCmd: {} {}".format(rtr, cmd))
output = tgen.net[rtr].cmd(cmd).strip()
if len(output):
self.output += 1
@@ -227,9 +228,10 @@ class ltemplateRtrCmd:
else:
self.match += 1
return ret
- logger.info("command: {} {}".format(rtr, cmd))
logger.info("output: " + output)
- self.none += 1
+ else:
+ logger.info("No output")
+ self.none += 1
return None
def resetCounts(self):
diff --git a/tests/topotests/lib/pim.py b/tests/topotests/lib/pim.py
index 9d37088218..944981add4 100644
--- a/tests/topotests/lib/pim.py
+++ b/tests/topotests/lib/pim.py
@@ -1020,10 +1020,10 @@ def verify_ip_mroutes(
if not isinstance(group_addresses, list):
group_addresses = [group_addresses]
- if not isinstance(iif, list) and iif is not "none":
+ if not isinstance(iif, list) and iif != "none":
iif = [iif]
- if not isinstance(oil, list) and oil is not "none":
+ if not isinstance(oil, list) and oil != "none":
oil = [oil]
for grp_addr in group_addresses:
diff --git a/tools/coccinelle/struct_thread_null.cocci b/tools/coccinelle/struct_thread_null.cocci
new file mode 100644
index 0000000000..4867b4454b
--- /dev/null
+++ b/tools/coccinelle/struct_thread_null.cocci
@@ -0,0 +1,9 @@
+@@
+identifier I;
+identifier func =~ "thread_add_";
+struct thread *thread;
+@@
+
+*thread = NULL;
+...
+func
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/watchfrr/watchfrr.c b/watchfrr/watchfrr.c
index d0b4be81d4..40749e8fc2 100644
--- a/watchfrr/watchfrr.c
+++ b/watchfrr/watchfrr.c
@@ -361,7 +361,6 @@ static int restart_kill(struct thread *t_kill)
(long)delay.tv_sec, (restart->kills ? SIGKILL : SIGTERM));
kill(-restart->pid, (restart->kills ? SIGKILL : SIGTERM));
restart->kills++;
- restart->t_kill = NULL;
thread_add_timer(master, restart_kill, restart, gs.restart_timeout,
&restart->t_kill);
return 0;
@@ -495,7 +494,6 @@ static int run_job(struct restart_info *restart, const char *cmdtype,
char cmd[strlen(command) + strlen(restart->name) + 1];
snprintf(cmd, sizeof(cmd), command, restart->name);
if ((restart->pid = run_background(cmd)) > 0) {
- restart->t_kill = NULL;
thread_add_timer(master, restart_kill, restart,
gs.restart_timeout, &restart->t_kill);
restart->what = cmdtype;
@@ -833,10 +831,8 @@ static int try_connect(struct daemon *dmn)
zlog_debug("%s: connection in progress", dmn->name);
dmn->state = DAEMON_CONNECTING;
dmn->fd = sock;
- dmn->t_write = NULL;
thread_add_write(master, check_connect, dmn, dmn->fd,
&dmn->t_write);
- dmn->t_wakeup = NULL;
thread_add_timer(master, wakeup_connect_hanging, dmn,
gs.timeout, &dmn->t_wakeup);
SET_READ_HANDLER(dmn);
@@ -1022,7 +1018,6 @@ static int wakeup_send_echo(struct thread *t_wakeup)
daemon_down(dmn, why);
} else {
gettimeofday(&dmn->echo_sent, NULL);
- dmn->t_wakeup = NULL;
thread_add_timer(master, wakeup_no_answer, dmn, gs.timeout,
&dmn->t_wakeup);
}
@@ -1269,7 +1264,6 @@ static void watchfrr_init(int argc, char **argv)
gs.numdaemons++;
gs.numdown++;
dmn->fd = -1;
- dmn->t_wakeup = NULL;
thread_add_timer_msec(master, wakeup_init, dmn, 0,
&dmn->t_wakeup);
dmn->restart.interval = gs.min_restart_interval;
diff --git a/zebra/if_netlink.c b/zebra/if_netlink.c
index 28a64407e5..15645d024d 100644
--- a/zebra/if_netlink.c
+++ b/zebra/if_netlink.c
@@ -1089,7 +1089,7 @@ int interface_lookup_netlink(struct zebra_ns *zns)
if (ret < 0)
return ret;
ret = netlink_parse_info(netlink_interface, netlink_cmd, &dp_info, 0,
- 1);
+ true);
if (ret < 0)
return ret;
@@ -1099,7 +1099,7 @@ int interface_lookup_netlink(struct zebra_ns *zns)
if (ret < 0)
return ret;
ret = netlink_parse_info(netlink_interface, netlink_cmd, &dp_info, 0,
- 0);
+ true);
if (ret < 0)
return ret;
@@ -1128,7 +1128,7 @@ static int interface_addr_lookup_netlink(struct zebra_ns *zns)
if (ret < 0)
return ret;
ret = netlink_parse_info(netlink_interface_addr, netlink_cmd, &dp_info,
- 0, 1);
+ 0, true);
if (ret < 0)
return ret;
@@ -1137,7 +1137,7 @@ static int interface_addr_lookup_netlink(struct zebra_ns *zns)
if (ret < 0)
return ret;
ret = netlink_parse_info(netlink_interface_addr, netlink_cmd, &dp_info,
- 0, 1);
+ 0, true);
if (ret < 0)
return ret;
@@ -1168,7 +1168,7 @@ int kernel_interface_set_master(struct interface *master,
nl_attr_put32(&req.n, sizeof(req), IFLA_LINK, slave->ifindex);
return netlink_talk(netlink_talk_filter, &req.n, &zns->netlink_cmd, zns,
- 0);
+ false);
}
/* Interface address modification. */
@@ -2054,7 +2054,7 @@ int netlink_protodown(struct interface *ifp, bool down)
nl_attr_put32(&req.n, sizeof(req), IFLA_LINK, ifp->ifindex);
return netlink_talk(netlink_talk_filter, &req.n, &zns->netlink_cmd, zns,
- 0);
+ false);
}
/* Interface information read by netlink. */
diff --git a/zebra/irdp_main.c b/zebra/irdp_main.c
index 66a6bd0545..f141b72719 100644
--- a/zebra/irdp_main.c
+++ b/zebra/irdp_main.c
@@ -112,7 +112,6 @@ int irdp_sock_init(void)
return ret;
};
- t_irdp_raw = NULL;
thread_add_read(zrouter.master, irdp_read_raw, NULL, sock, &t_irdp_raw);
return sock;
diff --git a/zebra/irdp_packet.c b/zebra/irdp_packet.c
index 7d67c42a79..5601b13a92 100644
--- a/zebra/irdp_packet.c
+++ b/zebra/irdp_packet.c
@@ -233,7 +233,6 @@ int irdp_read_raw(struct thread *r)
int ret, ifindex = 0;
int irdp_sock = THREAD_FD(r);
- t_irdp_raw = NULL;
thread_add_read(zrouter.master, irdp_read_raw, NULL, irdp_sock,
&t_irdp_raw);
diff --git a/zebra/kernel_netlink.c b/zebra/kernel_netlink.c
index 602bdc1dc5..86e8f65b5f 100644
--- a/zebra/kernel_netlink.c
+++ b/zebra/kernel_netlink.c
@@ -419,7 +419,7 @@ static int kernel_read(struct thread *thread)
zebra_dplane_info_from_zns(&dp_info, zns, false);
netlink_parse_info(netlink_information_fetch, &zns->netlink, &dp_info,
- 5, 0);
+ 5, false);
thread_add_read(zrouter.master, kernel_read, zns, zns->netlink.sock,
&zns->t_netlink);
@@ -433,7 +433,7 @@ static int kernel_read(struct thread *thread)
int kernel_dplane_read(struct zebra_dplane_info *info)
{
netlink_parse_info(dplane_netlink_information_fetch, &info->nls, info,
- 5, 0);
+ 5, false);
return 0;
}
@@ -933,7 +933,7 @@ static int netlink_parse_error(const struct nlsock *nl, struct nlmsghdr *h,
int netlink_parse_info(int (*filter)(struct nlmsghdr *, ns_id_t, int),
const struct nlsock *nl,
const struct zebra_dplane_info *zns,
- int count, int startup)
+ int count, bool startup)
{
int status;
int ret = 0;
@@ -1036,7 +1036,7 @@ int netlink_parse_info(int (*filter)(struct nlmsghdr *, ns_id_t, int),
static int
netlink_talk_info(int (*filter)(struct nlmsghdr *, ns_id_t, int startup),
struct nlmsghdr *n, const struct zebra_dplane_info *dp_info,
- int startup)
+ bool startup)
{
const struct nlsock *nl;
@@ -1067,7 +1067,7 @@ netlink_talk_info(int (*filter)(struct nlmsghdr *, ns_id_t, int startup),
*/
int netlink_talk(int (*filter)(struct nlmsghdr *, ns_id_t, int startup),
struct nlmsghdr *n, struct nlsock *nl, struct zebra_ns *zns,
- int startup)
+ bool startup)
{
struct zebra_dplane_info dp_info;
diff --git a/zebra/kernel_netlink.h b/zebra/kernel_netlink.h
index d8e5671b72..37c76b9e59 100644
--- a/zebra/kernel_netlink.h
+++ b/zebra/kernel_netlink.h
@@ -94,11 +94,11 @@ extern const char *nl_rttype_to_str(uint8_t rttype);
extern int netlink_parse_info(int (*filter)(struct nlmsghdr *, ns_id_t, int),
const struct nlsock *nl,
const struct zebra_dplane_info *dp_info,
- int count, int startup);
+ int count, bool startup);
extern int netlink_talk_filter(struct nlmsghdr *h, ns_id_t ns, int startup);
extern int netlink_talk(int (*filter)(struct nlmsghdr *, ns_id_t, int startup),
struct nlmsghdr *n, struct nlsock *nl,
- struct zebra_ns *zns, int startup);
+ struct zebra_ns *zns, bool startup);
extern int netlink_request(struct nlsock *nl, void *req);
enum netlink_msg_status {
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
index e36f320ad9..488bca06da 100644
--- a/zebra/rt_netlink.c
+++ b/zebra/rt_netlink.c
@@ -1171,7 +1171,7 @@ int netlink_route_read(struct zebra_ns *zns)
if (ret < 0)
return ret;
ret = netlink_parse_info(netlink_route_change_read_unicast,
- &zns->netlink_cmd, &dp_info, 0, 1);
+ &zns->netlink_cmd, &dp_info, 0, true);
if (ret < 0)
return ret;
@@ -1180,7 +1180,7 @@ int netlink_route_read(struct zebra_ns *zns)
if (ret < 0)
return ret;
ret = netlink_parse_info(netlink_route_change_read_unicast,
- &zns->netlink_cmd, &dp_info, 0, 1);
+ &zns->netlink_cmd, &dp_info, 0, true);
if (ret < 0)
return ret;
@@ -1810,7 +1810,7 @@ static int netlink_neigh_update(int cmd, int ifindex, void *addr, char *lla,
nl_attr_put(&req.n, sizeof(req), NDA_LLADDR, lla, llalen);
return netlink_talk(netlink_talk_filter, &req.n, &zns->netlink_cmd, zns,
- 0);
+ false);
}
static bool nexthop_set_src(const struct nexthop *nexthop, int family,
@@ -2268,7 +2268,7 @@ int kernel_get_ipmr_sg_stats(struct zebra_vrf *zvrf, void *in)
nl_attr_put32(&req.n, sizeof(req), RTA_TABLE, actual_table);
suc = netlink_talk(netlink_route_change_read_multicast, &req.n,
- &zns->netlink_cmd, zns, 0);
+ &zns->netlink_cmd, zns, false);
mroute = NULL;
return suc;
@@ -3019,7 +3019,7 @@ int netlink_nexthop_read(struct zebra_ns *zns)
if (ret < 0)
return ret;
ret = netlink_parse_info(netlink_nexthop_change, &zns->netlink_cmd,
- &dp_info, 0, 1);
+ &dp_info, 0, true);
if (!ret)
/* If we succesfully read in nexthop objects,
@@ -3427,7 +3427,7 @@ int netlink_macfdb_read(struct zebra_ns *zns)
/* We are reading entire table. */
filter_vlan = 0;
ret = netlink_parse_info(netlink_macfdb_table, &zns->netlink_cmd,
- &dp_info, 0, 1);
+ &dp_info, 0, true);
return ret;
}
@@ -3461,7 +3461,7 @@ int netlink_macfdb_read_for_bridge(struct zebra_ns *zns, struct interface *ifp,
if (ret < 0)
return ret;
ret = netlink_parse_info(netlink_macfdb_table, &zns->netlink_cmd,
- &dp_info, 0, 0);
+ &dp_info, 0, false);
/* Reset VLAN filter. */
filter_vlan = 0;
@@ -3526,7 +3526,7 @@ int netlink_macfdb_read_specific_mac(struct zebra_ns *zns,
return ret;
ret = netlink_parse_info(netlink_macfdb_table, &zns->netlink_cmd,
- &dp_info, 1, 0);
+ &dp_info, 1, false);
return ret;
}
@@ -3930,7 +3930,7 @@ int netlink_neigh_read(struct zebra_ns *zns)
if (ret < 0)
return ret;
ret = netlink_parse_info(netlink_neigh_table, &zns->netlink_cmd,
- &dp_info, 0, 1);
+ &dp_info, 0, true);
return ret;
}
@@ -3951,7 +3951,7 @@ int netlink_neigh_read_for_vlan(struct zebra_ns *zns, struct interface *vlan_if)
if (ret < 0)
return ret;
ret = netlink_parse_info(netlink_neigh_table, &zns->netlink_cmd,
- &dp_info, 0, 0);
+ &dp_info, 0, false);
return ret;
}
@@ -4022,7 +4022,7 @@ int netlink_neigh_read_specific_ip(const struct ipaddr *ip,
return ret;
ret = netlink_parse_info(netlink_neigh_table, &zns->netlink_cmd,
- &dp_info, 1, 0);
+ &dp_info, 1, false);
return ret;
}
@@ -4442,7 +4442,7 @@ static int netlink_fdb_nh_update(uint32_t nh_id, struct in_addr vtep_ip)
}
return netlink_talk(netlink_talk_filter, &req.n, &zns->netlink_cmd, zns,
- 0);
+ false);
}
static int netlink_fdb_nh_del(uint32_t nh_id)
@@ -4477,7 +4477,7 @@ static int netlink_fdb_nh_del(uint32_t nh_id)
}
return netlink_talk(netlink_talk_filter, &req.n, &zns->netlink_cmd, zns,
- 0);
+ false);
}
static int netlink_fdb_nhg_update(uint32_t nhg_id, uint32_t nh_cnt,
@@ -4537,7 +4537,7 @@ static int netlink_fdb_nhg_update(uint32_t nhg_id, uint32_t nh_cnt,
}
return netlink_talk(netlink_talk_filter, &req.n, &zns->netlink_cmd, zns,
- 0);
+ false);
}
static int netlink_fdb_nhg_del(uint32_t nhg_id)
diff --git a/zebra/rule_netlink.c b/zebra/rule_netlink.c
index b651edd8f9..fbf2620375 100644
--- a/zebra/rule_netlink.c
+++ b/zebra/rule_netlink.c
@@ -403,7 +403,7 @@ int netlink_rules_read(struct zebra_ns *zns)
return ret;
ret = netlink_parse_info(netlink_rule_change, &zns->netlink_cmd,
- &dp_info, 0, 1);
+ &dp_info, 0, true);
if (ret < 0)
return ret;
@@ -412,7 +412,7 @@ int netlink_rules_read(struct zebra_ns *zns)
return ret;
ret = netlink_parse_info(netlink_rule_change, &zns->netlink_cmd,
- &dp_info, 0, 1);
+ &dp_info, 0, true);
return ret;
}
diff --git a/zebra/zebra_netns_notify.c b/zebra/zebra_netns_notify.c
index 054015846f..61f97ce6a9 100644
--- a/zebra/zebra_netns_notify.c
+++ b/zebra/zebra_netns_notify.c
@@ -346,7 +346,6 @@ void zebra_ns_notify_init(void)
{
int fd_monitor;
- zebra_netns_notify_current = NULL;
fd_monitor = inotify_init();
if (fd_monitor < 0) {
flog_err_sys(
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);