summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfdd/control.c1
-rw-r--r--bgpd/bgp_clist.c2
-rw-r--r--bgpd/bgp_dump.c3
-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_route.c53
-rw-r--r--bgpd/bgp_routemap_nb_config.c35
-rw-r--r--bgpd/bgp_trace.h90
-rw-r--r--configure.ac2
-rw-r--r--doc/user/bgp.rst4
-rw-r--r--doc/user/isisd.rst4
-rw-r--r--doc/user/ospf6d.rst5
-rw-r--r--doc/user/ospfd.rst11
-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.c4
-rw-r--r--ldpd/ldpe.c6
-rw-r--r--ldpd/packet.c3
-rw-r--r--lib/command_graph.h4
-rw-r--r--lib/frr_zmq.c43
-rw-r--r--lib/frr_zmq.h3
-rw-r--r--lib/northbound_grpc.cpp4
-rw-r--r--lib/resolver.c28
-rw-r--r--lib/vector.c11
-rw-r--r--lib/vector.h1
-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_abr.c20
-rw-r--r--ospf6d/ospf6_abr.h2
-rw-r--r--ospf6d/ospf6_asbr.c10
-rw-r--r--ospf6d/ospf6_flood.c19
-rw-r--r--ospf6d/ospf6_interface.c1
-rw-r--r--ospf6d/ospf6_intra.c17
-rw-r--r--ospf6d/ospf6_lsa.c1
-rw-r--r--ospf6d/ospf6_message.c10
-rw-r--r--ospf6d/ospf6_neighbor.c4
-rw-r--r--ospf6d/ospf6_nssa.c16
-rw-r--r--ospf6d/ospf6_route.c2
-rw-r--r--ospfd/ospf_gr_helper.c6
-rw-r--r--ospfd/ospf_interface.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_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--tools/coccinelle/struct_thread_null.cocci9
-rwxr-xr-xtools/frr_babeltrace.py163
-rw-r--r--watchfrr/watchfrr.c14
-rw-r--r--watchfrr/watchfrr.h6
-rw-r--r--watchfrr/watchfrr_vty.c5
-rw-r--r--yang/frr-nexthop.yang2
-rw-r--r--zebra/connected.c3
-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/rtadv.c34
-rw-r--r--zebra/rule_netlink.c4
-rw-r--r--zebra/zebra_netns_notify.c1
-rw-r--r--zebra/zebra_vty.c1
100 files changed, 590 insertions, 338 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_dump.c b/bgpd/bgp_dump.c
index 299ee305be..2f0b87aa3a 100644
--- a/bgpd/bgp_dump.c
+++ b/bgpd/bgp_dump.c
@@ -165,13 +165,11 @@ static int bgp_dump_interval_add(struct bgp_dump *bgp_dump, int interval)
interval = interval
- secs_into_day % interval; /* always > 0 */
}
- bgp_dump->t_interval = NULL;
thread_add_timer(bm->master, bgp_dump_interval_func, bgp_dump,
interval, &bgp_dump->t_interval);
} else {
/* One-off dump: execute immediately, don't affect any scheduled
* dumps */
- bgp_dump->t_interval = NULL;
thread_add_event(bm->master, bgp_dump_interval_func, bgp_dump,
0, &bgp_dump->t_interval);
}
@@ -453,7 +451,6 @@ static int bgp_dump_interval_func(struct thread *t)
{
struct bgp_dump *bgp_dump;
bgp_dump = THREAD_ARG(t);
- bgp_dump->t_interval = NULL;
/* Reschedule dump even if file couldn't be opened this time... */
if (bgp_dump_open_file(bgp_dump) != NULL) {
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_route.c b/bgpd/bgp_route.c
index 5bc1b5a40a..0eb3cc61e3 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -13967,10 +13967,11 @@ DEFPY (show_ip_bgp_instance_neighbor_advertised_route,
DEFUN (show_ip_bgp_neighbor_received_prefix_filter,
show_ip_bgp_neighbor_received_prefix_filter_cmd,
- "show [ip] bgp [<ipv4|ipv6> [unicast]] neighbors <A.B.C.D|X:X::X:X|WORD> received prefix-filter [json]",
+ "show [ip] bgp [<view|vrf> VIEWVRFNAME] [<ipv4|ipv6> [unicast]] neighbors <A.B.C.D|X:X::X:X|WORD> received prefix-filter [json]",
SHOW_STR
IP_STR
BGP_STR
+ BGP_INSTANCE_HELP_STR
"Address Family\n"
"Address Family\n"
"Address Family modifier\n"
@@ -13985,50 +13986,28 @@ DEFUN (show_ip_bgp_neighbor_received_prefix_filter,
afi_t afi = AFI_IP6;
safi_t safi = SAFI_UNICAST;
char *peerstr = NULL;
-
char name[BUFSIZ];
- union sockunion su;
struct peer *peer;
- int count, ret;
-
+ int count;
int idx = 0;
+ struct bgp *bgp = NULL;
+ bool uj = use_json(argc, argv);
+
+ if (uj)
+ argc--;
+
+ bgp_vty_find_and_parse_afi_safi_bgp(vty, argv, argc, &idx, &afi, &safi,
+ &bgp, uj);
+ if (!idx)
+ return CMD_WARNING;
- /* show [ip] bgp */
- if (argv_find(argv, argc, "ip", &idx))
- afi = AFI_IP;
- /* [<ipv4|ipv6> [unicast]] */
- if (argv_find(argv, argc, "ipv4", &idx))
- afi = AFI_IP;
- if (argv_find(argv, argc, "ipv6", &idx))
- afi = AFI_IP6;
/* neighbors <A.B.C.D|X:X::X:X|WORD> */
argv_find(argv, argc, "neighbors", &idx);
peerstr = argv[++idx]->arg;
- bool uj = use_json(argc, argv);
-
- ret = str2sockunion(peerstr, &su);
- if (ret < 0) {
- peer = peer_lookup_by_conf_if(NULL, peerstr);
- if (!peer) {
- if (uj)
- vty_out(vty, "{}\n");
- else
- vty_out(vty,
- "%% Malformed address or name: %s\n",
- peerstr);
- return CMD_WARNING;
- }
- } else {
- peer = peer_lookup(NULL, &su);
- if (!peer) {
- if (uj)
- vty_out(vty, "{}\n");
- else
- vty_out(vty, "No peer\n");
- return CMD_WARNING;
- }
- }
+ peer = peer_lookup_in_view(vty, bgp, peerstr, uj);
+ if (!peer)
+ return CMD_WARNING;
snprintf(name, sizeof(name), "%s.%d.%d", peer->host, afi, safi);
count = prefix_bgp_show_prefix_list(NULL, afi, name, uj);
diff --git a/bgpd/bgp_routemap_nb_config.c b/bgpd/bgp_routemap_nb_config.c
index 85676e6758..09a6be4010 100644
--- a/bgpd/bgp_routemap_nb_config.c
+++ b/bgpd/bgp_routemap_nb_config.c
@@ -1035,6 +1035,7 @@ lib_route_map_entry_match_condition_rmap_match_condition_comm_list_finish(
char *argstr;
const char *condition;
route_map_event_t event;
+ int ret;
/* Add configuration. */
rhc = nb_running_get_entry(args->dnode, NULL, true);
@@ -1072,8 +1073,14 @@ lib_route_map_entry_match_condition_rmap_match_condition_comm_list_finish(
rhc->rhc_event = RMAP_EVENT_ECLIST_DELETED;
}
- bgp_route_match_add(rhc->rhc_rmi, rhc->rhc_rule, argstr, event,
- args->errmsg, args->errmsg_len);
+ ret = bgp_route_match_add(rhc->rhc_rmi, rhc->rhc_rule, argstr, event,
+ args->errmsg, args->errmsg_len);
+ /*
+ * At this point if this is not a successful operation
+ * bgpd is about to crash. Let's just cut to the
+ * chase and do it.
+ */
+ assert(ret == RMAP_COMPILE_SUCCESS);
if (argstr != value)
XFREE(MTYPE_ROUTE_MAP_COMPILED, argstr);
@@ -2440,6 +2447,7 @@ void lib_route_map_entry_set_action_rmap_set_action_aggregator_finish(
const char *asn;
const char *addr;
char *argstr;
+ int ret;
/* Add configuration. */
rhc = nb_running_get_entry(args->dnode, NULL, true);
@@ -2456,8 +2464,15 @@ void lib_route_map_entry_set_action_rmap_set_action_aggregator_finish(
rhc->rhc_rule = "aggregator as";
rhc->rhc_event = RMAP_EVENT_SET_DELETED;
- generic_set_add(rhc->rhc_rmi, rhc->rhc_rule, argstr,
- args->errmsg, args->errmsg_len);
+ ret = generic_set_add(rhc->rhc_rmi, rhc->rhc_rule, argstr, args->errmsg,
+ args->errmsg_len);
+ /*
+ * At this point if this is not a successful operation
+ * bgpd is about to crash. Let's just cut to the
+ * chase and do it.
+ */
+ assert(ret == CMD_SUCCESS);
+
XFREE(MTYPE_ROUTE_MAP_COMPILED, argstr);
}
/*
@@ -2604,6 +2619,7 @@ lib_route_map_entry_set_action_rmap_set_action_extcommunity_lb_finish(
enum ecommunity_lb_type lb_type;
char str[VTY_BUFSIZ];
uint16_t bandwidth;
+ int ret;
/* Add configuration. */
rhc = nb_running_get_entry(args->dnode, NULL, true);
@@ -2629,9 +2645,14 @@ lib_route_map_entry_set_action_rmap_set_action_extcommunity_lb_finish(
if (yang_dnode_get_bool(args->dnode, "./two-octet-as-specific"))
strlcat(str, " non-transitive", sizeof(str));
- generic_set_add(rhc->rhc_rmi,
- "extcommunity bandwidth", str,
- args->errmsg, args->errmsg_len);
+ ret = generic_set_add(rhc->rhc_rmi, "extcommunity bandwidth", str,
+ args->errmsg, args->errmsg_len);
+ /*
+ * At this point if this is not a successful operation
+ * bgpd is about to crash. Let's just cut to the
+ * chase and do it.
+ */
+ assert(ret == CMD_SUCCESS);
}
/*
diff --git a/bgpd/bgp_trace.h b/bgpd/bgp_trace.h
index 92f23ecf70..91a190722b 100644
--- a/bgpd/bgp_trace.h
+++ b/bgpd/bgp_trace.h
@@ -36,6 +36,9 @@
#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 */
@@ -244,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/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 d37c2b6682..5fcddafaaa 100644
--- a/doc/user/bgp.rst
+++ b/doc/user/bgp.rst
@@ -3540,6 +3540,10 @@ structure is extended with :clicmd:`show bgp [afi] [safi]`.
The ``received-routes`` keyword displays all routes belonging to this
address-family (prior to inbound policy) that were received by this peer.
+.. clicmd:: show bgp [<view|vrf> VIEWVRFNAME] [afi] [safi] neighbors PEER received prefix-filter [json]
+
+ Display Address Prefix ORFs received from this peer.
+
.. clicmd:: show bgp [afi] [safi] [all] dampening dampened-paths [wide|json]
Display paths suppressed due to dampening of the selected afi and safi
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/ospf6d.rst b/doc/user/ospf6d.rst
index d823c5d5b5..093c5382cf 100644
--- a/doc/user/ospf6d.rst
+++ b/doc/user/ospf6d.rst
@@ -476,9 +476,10 @@ The following debug commands are supported:
Toggle OSPFv3 ASBR debugging messages.
-.. clicmd:: debug ospf6 border-routers
+.. clicmd:: debug ospf6 border-routers {router-id [A.B.C.D] | area-id [A.B.C.D]}
- Toggle OSPFv3 border router debugging messages.
+ Toggle OSPFv3 border router debugging messages. This can be specified for a
+ router with specific Router-ID/Area-ID.
.. clicmd:: debug ospf6 flooding
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/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 e24eba7cd4..9d80bed77f 100644
--- a/ldpd/ldpd.c
+++ b/ldpd/ldpd.c
@@ -403,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/frr_zmq.c b/lib/frr_zmq.c
index ea9c828f7c..4e947a8a84 100644
--- a/lib/frr_zmq.c
+++ b/lib/frr_zmq.c
@@ -84,7 +84,10 @@ static int frrzmq_read_msg(struct thread *t)
break;
if (cb->read.cb_msg) {
+ cb->in_cb = true;
cb->read.cb_msg(cb->read.arg, cb->zmqsock);
+ cb->in_cb = false;
+
read = 1;
if (cb->read.cancelled) {
@@ -92,7 +95,8 @@ static int frrzmq_read_msg(struct thread *t)
ZMQ_POLLOUT);
cb->read.thread = NULL;
if (cb->write.cancelled && !cb->write.thread)
- XFREE(MTYPE_ZEROMQ_CB, cb);
+ XFREE(MTYPE_ZEROMQ_CB, *cbp);
+
return 0;
}
continue;
@@ -112,15 +116,19 @@ static int frrzmq_read_msg(struct thread *t)
}
read = 1;
+ cb->in_cb = true;
cb->read.cb_part(cb->read.arg, cb->zmqsock, &msg,
partno);
+ cb->in_cb = false;
+
if (cb->read.cancelled) {
zmq_msg_close(&msg);
frrzmq_check_events(cbp, &cb->write,
ZMQ_POLLOUT);
cb->read.thread = NULL;
if (cb->write.cancelled && !cb->write.thread)
- XFREE(MTYPE_ZEROMQ_CB, cb);
+ XFREE(MTYPE_ZEROMQ_CB, *cbp);
+
return 0;
}
@@ -183,7 +191,6 @@ int _frrzmq_thread_add_read(const struct xref_threadsched *xref,
cb = *cbp;
else {
cb = XCALLOC(MTYPE_ZEROMQ_CB, sizeof(struct frrzmq_cb));
-
cb->write.cancelled = true;
*cbp = cb;
}
@@ -195,6 +202,7 @@ int _frrzmq_thread_add_read(const struct xref_threadsched *xref,
cb->read.cb_part = partfunc;
cb->read.cb_error = errfunc;
cb->read.cancelled = false;
+ cb->in_cb = false;
if (events & ZMQ_POLLIN) {
thread_cancel(&cb->read.thread);
@@ -232,14 +240,18 @@ static int frrzmq_write_msg(struct thread *t)
break;
if (cb->write.cb_msg) {
+ cb->in_cb = true;
cb->write.cb_msg(cb->write.arg, cb->zmqsock);
+ cb->in_cb = false;
+
written = 1;
if (cb->write.cancelled) {
frrzmq_check_events(cbp, &cb->read, ZMQ_POLLIN);
cb->write.thread = NULL;
if (cb->read.cancelled && !cb->read.thread)
- XFREE(MTYPE_ZEROMQ_CB, cb);
+ XFREE(MTYPE_ZEROMQ_CB, *cbp);
+
return 0;
}
continue;
@@ -286,7 +298,6 @@ int _frrzmq_thread_add_write(const struct xref_threadsched *xref,
cb = *cbp;
else {
cb = XCALLOC(MTYPE_ZEROMQ_CB, sizeof(struct frrzmq_cb));
-
cb->read.cancelled = true;
*cbp = cb;
}
@@ -298,6 +309,7 @@ int _frrzmq_thread_add_write(const struct xref_threadsched *xref,
cb->write.cb_part = NULL;
cb->write.cb_error = errfunc;
cb->write.cancelled = false;
+ cb->in_cb = false;
if (events & ZMQ_POLLOUT) {
thread_cancel(&cb->write.thread);
@@ -317,22 +329,15 @@ void frrzmq_thread_cancel(struct frrzmq_cb **cb, struct cb_core *core)
core->cancelled = true;
thread_cancel(&core->thread);
- /*
- * Looking at this code one would assume that FRR
- * would want a `!(*cb)->write.thread. This was
- * attempted in e08165def1c62beee0e87385 but this
- * change caused `make check` to stop working
- * which was not noticed because our CI system
- * does not build with zeromq. Put this back
- * to the code as written in 2017. e08165de..
- * was introduced in 2021. So someone was ok
- * with frrzmq_thread_cancel for 4 years. This will
- * allow those people doing `make check` to continue
- * working. In the meantime if the people using
- * this code see an issue they can fix it
+ /* If cancelled from within a callback, don't try to free memory
+ * in this path.
*/
+ if ((*cb)->in_cb)
+ return;
+
+ /* Ok to free the callback context if no more ... context. */
if ((*cb)->read.cancelled && !(*cb)->read.thread
- && (*cb)->write.cancelled && (*cb)->write.thread)
+ && (*cb)->write.cancelled && ((*cb)->write.thread == NULL))
XFREE(MTYPE_ZEROMQ_CB, *cb);
}
diff --git a/lib/frr_zmq.h b/lib/frr_zmq.h
index d30cf8a841..b3be78cbea 100644
--- a/lib/frr_zmq.h
+++ b/lib/frr_zmq.h
@@ -49,10 +49,13 @@ struct cb_core {
unsigned partnum);
void (*cb_error)(void *arg, void *zmqsock);
};
+
struct frrzmq_cb {
void *zmqsock;
int fd;
+ bool in_cb; /* This context is in a read or write callback. */
+
struct cb_core read;
struct cb_core write;
};
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/lib/resolver.c b/lib/resolver.c
index c2153e0a5e..4aba909f25 100644
--- a/lib/resolver.c
+++ b/lib/resolver.c
@@ -53,14 +53,14 @@ static int resolver_cb_socket_readable(struct thread *t)
{
struct resolver_state *r = THREAD_ARG(t);
int fd = THREAD_FD(t);
+ struct thread **t_ptr;
vector_set_index(r->read_threads, fd, THREAD_RUNNING);
ares_process_fd(r->channel, fd, ARES_SOCKET_BAD);
if (vector_lookup(r->read_threads, fd) == THREAD_RUNNING) {
- t = NULL;
+ t_ptr = (struct thread **)vector_get_index(r->read_threads, fd);
thread_add_read(r->master, resolver_cb_socket_readable, r, fd,
- &t);
- vector_set_index(r->read_threads, fd, t);
+ t_ptr);
}
resolver_update_timeouts(r);
@@ -71,14 +71,14 @@ static int resolver_cb_socket_writable(struct thread *t)
{
struct resolver_state *r = THREAD_ARG(t);
int fd = THREAD_FD(t);
+ struct thread **t_ptr;
vector_set_index(r->write_threads, fd, THREAD_RUNNING);
ares_process_fd(r->channel, ARES_SOCKET_BAD, fd);
if (vector_lookup(r->write_threads, fd) == THREAD_RUNNING) {
- t = NULL;
+ t_ptr = (struct thread **)vector_get_index(r->write_threads, fd);
thread_add_write(r->master, resolver_cb_socket_writable, r, fd,
- &t);
- vector_set_index(r->write_threads, fd, t);
+ t_ptr);
}
resolver_update_timeouts(r);
@@ -105,14 +105,15 @@ static void ares_socket_cb(void *data, ares_socket_t fd, int readable,
int writable)
{
struct resolver_state *r = (struct resolver_state *)data;
- struct thread *t;
+ struct thread *t, **t_ptr;
if (readable) {
- t = vector_lookup_ensure(r->read_threads, fd);
+ t = vector_lookup(r->read_threads, fd);
if (!t) {
+ t_ptr = (struct thread **)vector_get_index(
+ r->read_threads, fd);
thread_add_read(r->master, resolver_cb_socket_readable,
- r, fd, &t);
- vector_set_index(r->read_threads, fd, t);
+ r, fd, t_ptr);
}
} else {
t = vector_lookup(r->read_threads, fd);
@@ -125,11 +126,12 @@ static void ares_socket_cb(void *data, ares_socket_t fd, int readable,
}
if (writable) {
- t = vector_lookup_ensure(r->write_threads, fd);
+ t = vector_lookup(r->write_threads, fd);
if (!t) {
+ t_ptr = (struct thread **)vector_get_index(
+ r->write_threads, fd);
thread_add_read(r->master, resolver_cb_socket_writable,
- r, fd, &t);
- vector_set_index(r->write_threads, fd, t);
+ r, fd, t_ptr);
}
} else {
t = vector_lookup(r->write_threads, fd);
diff --git a/lib/vector.c b/lib/vector.c
index 565c49fd59..4af564a82f 100644
--- a/lib/vector.c
+++ b/lib/vector.c
@@ -123,6 +123,17 @@ int vector_set_index(vector v, unsigned int i, void *val)
return i;
}
+/* Make a specified index slot active and return its address. */
+void **vector_get_index(vector v, unsigned int i)
+{
+ vector_ensure(v, i);
+
+ if (v->active <= i)
+ v->active = i + 1;
+
+ return &v->index[i];
+}
+
/* Look up vector. */
void *vector_lookup(vector v, unsigned int i)
{
diff --git a/lib/vector.h b/lib/vector.h
index d5857eb599..845c8d8b04 100644
--- a/lib/vector.h
+++ b/lib/vector.h
@@ -54,6 +54,7 @@ extern void vector_ensure(vector v, unsigned int num);
extern int vector_empty_slot(vector v);
extern int vector_set(vector v, void *val);
extern int vector_set_index(vector v, unsigned int i, void *val);
+extern void **vector_get_index(vector v, unsigned int i);
extern void vector_unset(vector v, unsigned int i);
extern void vector_unset_value(vector v, void *val);
extern void vector_remove(vector v, unsigned int ix);
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_abr.c b/ospf6d/ospf6_abr.c
index 57165201bd..f3e8127a80 100644
--- a/ospf6d/ospf6_abr.c
+++ b/ospf6d/ospf6_abr.c
@@ -53,6 +53,16 @@
unsigned char conf_debug_ospf6_abr;
+int ospf6_ls_origin_same(struct ospf6_path *o_path, struct ospf6_path *r_path)
+{
+ if (((o_path->origin.type == r_path->origin.type)
+ && (o_path->origin.id == r_path->origin.id)
+ && (o_path->origin.adv_router == r_path->origin.adv_router)))
+ return 1;
+ else
+ return 0;
+}
+
bool ospf6_check_and_set_router_abr(struct ospf6 *o)
{
struct listnode *node;
@@ -815,9 +825,8 @@ void ospf6_abr_old_path_update(struct ospf6_route *old_route,
struct ospf6_nexthop *nh, *rnh;
for (ALL_LIST_ELEMENTS(old_route->paths, anode, anext, o_path)) {
- if (o_path->area_id != route->path.area_id ||
- (memcmp(&(o_path)->origin, &(route)->path.origin,
- sizeof(struct ospf6_ls_origin)) != 0))
+ if (o_path->area_id != route->path.area_id
+ || !ospf6_ls_origin_same(o_path, &route->path))
continue;
if ((o_path->cost == route->path.cost) &&
@@ -1232,9 +1241,8 @@ void ospf6_abr_examin_summary(struct ospf6_lsa *lsa, struct ospf6_area *oa)
for (ALL_LIST_ELEMENTS_RO(old_route->paths, anode,
o_path)) {
- if (o_path->area_id == route->path.area_id &&
- (memcmp(&(o_path)->origin, &(route)->path.origin,
- sizeof(struct ospf6_ls_origin)) == 0))
+ if (o_path->area_id == route->path.area_id
+ && ospf6_ls_origin_same(o_path, &route->path))
break;
}
diff --git a/ospf6d/ospf6_abr.h b/ospf6d/ospf6_abr.h
index 08521ecb0f..a4dc4ddc84 100644
--- a/ospf6d/ospf6_abr.h
+++ b/ospf6d/ospf6_abr.h
@@ -89,5 +89,7 @@ extern void ospf6_abr_init(void);
extern void ospf6_abr_range_update(struct ospf6_route *range,
struct ospf6 *ospf6);
extern void ospf6_abr_remove_unapproved_summaries(struct ospf6 *ospf6);
+extern int ospf6_ls_origin_same(struct ospf6_path *o_path,
+ struct ospf6_path *r_path);
#endif /*OSPF6_ABR_H*/
diff --git a/ospf6d/ospf6_asbr.c b/ospf6d/ospf6_asbr.c
index df40c608a1..733f4ba1fb 100644
--- a/ospf6d/ospf6_asbr.c
+++ b/ospf6d/ospf6_asbr.c
@@ -290,9 +290,7 @@ void ospf6_asbr_update_route_ecmp_path(struct ospf6_route *old,
* origin.
*/
if (o_path->area_id != route->path.area_id
- || (memcmp(&(o_path)->origin, &(route)->path.origin,
- sizeof(struct ospf6_ls_origin))
- != 0))
+ || !ospf6_ls_origin_same(o_path, &route->path))
continue;
/* Cost is not same then delete current path */
@@ -411,10 +409,7 @@ void ospf6_asbr_update_route_ecmp_path(struct ospf6_route *old,
for (ALL_LIST_ELEMENTS_RO(old_route->paths, anode,
o_path)) {
if (o_path->area_id == route->path.area_id
- && (memcmp(&(o_path)->origin,
- &(route)->path.origin,
- sizeof(struct ospf6_ls_origin))
- == 0))
+ && ospf6_ls_origin_same(o_path, &route->path))
break;
}
/* If path is not found in old_route paths's list,
@@ -1139,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 186eac35a5..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);
}
@@ -1239,7 +1237,6 @@ void ospf6_receive_lsa(struct ospf6_neighbor *from,
ospf6_lsa_delete(new);
return;
}
- return;
}
}
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_intra.c b/ospf6d/ospf6_intra.c
index 277af4b1c5..2d82ff7ce8 100644
--- a/ospf6d/ospf6_intra.c
+++ b/ospf6d/ospf6_intra.c
@@ -1524,9 +1524,8 @@ void ospf6_intra_prefix_route_ecmp_path(struct ospf6_area *oa,
/* Check old route path and route has same
* origin.
*/
- if (o_path->area_id != route->path.area_id ||
- (memcmp(&(o_path)->origin, &(route)->path.origin,
- sizeof(struct ospf6_ls_origin)) != 0))
+ if (o_path->area_id != route->path.area_id
+ || !ospf6_ls_origin_same(o_path, &route->path))
continue;
/* Cost is not same then delete current path */
@@ -1630,10 +1629,8 @@ void ospf6_intra_prefix_route_ecmp_path(struct ospf6_area *oa,
*/
for (ALL_LIST_ELEMENTS_RO(old_route->paths, anode,
o_path)) {
- if (o_path->area_id == route->path.area_id &&
- (memcmp(&(o_path)->origin,
- &(route)->path.origin,
- sizeof(struct ospf6_ls_origin)) == 0))
+ if (o_path->area_id == route->path.area_id
+ && ospf6_ls_origin_same(o_path, &route->path))
break;
}
/* If path is not found in old_route paths's list,
@@ -2479,12 +2476,13 @@ DEFUN (debug_ospf6_brouter_router,
DEFUN (no_debug_ospf6_brouter_router,
no_debug_ospf6_brouter_router_cmd,
- "no debug ospf6 border-routers router-id",
+ "no debug ospf6 border-routers router-id [A.B.C.D]",
NO_STR
DEBUG_STR
OSPF6_STR
"Debug border router\n"
"Debug specific border router\n"
+ "Specify border-router's router-id\n"
)
{
OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER_OFF();
@@ -2510,12 +2508,13 @@ DEFUN (debug_ospf6_brouter_area,
DEFUN (no_debug_ospf6_brouter_area,
no_debug_ospf6_brouter_area_cmd,
- "no debug ospf6 border-routers area-id",
+ "no debug ospf6 border-routers area-id [A.B.C.D]",
NO_STR
DEBUG_STR
OSPF6_STR
"Debug border router\n"
"Debug border routers in specific Area\n"
+ "Specify Area-ID\n"
)
{
OSPF6_DEBUG_BROUTER_SPECIFIC_AREA_OFF();
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 64de9bae41..a81c3e728f 100644
--- a/ospf6d/ospf6_message.c
+++ b/ospf6d/ospf6_message.c
@@ -726,7 +726,6 @@ static void ospf6_dbdesc_recv_master(struct ospf6_header *oh,
zlog_debug("Ignoring LSA of reserved scope");
ospf6_lsa_delete(his);
continue;
- break;
}
if (ntohs(his->header->type) == OSPF6_LSTYPE_AS_EXTERNAL
@@ -775,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);
}
@@ -856,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;
@@ -949,7 +946,6 @@ static void ospf6_dbdesc_recv_slave(struct ospf6_header *oh,
zlog_debug("Ignoring LSA of reserved scope");
ospf6_lsa_delete(his);
continue;
- break;
}
if (OSPF6_LSA_SCOPE(his->header->type) == OSPF6_SCOPE_AS
@@ -1084,7 +1080,6 @@ static void ospf6_lsreq_recv(struct in6_addr *src, struct in6_addr *dst,
if (IS_OSPF6_DEBUG_MESSAGE(oh->type, RECV))
zlog_debug("Ignoring LSA of reserved scope");
continue;
- break;
}
/* Find database copy */
@@ -1636,7 +1631,6 @@ static void ospf6_lsack_recv(struct in6_addr *src, struct in6_addr *dst,
zlog_debug("Ignoring LSA of reserved scope");
ospf6_lsa_delete(his);
continue;
- break;
}
if (IS_OSPF6_DEBUG_MESSAGE(oh->type, RECV))
@@ -2399,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);
@@ -2585,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);
@@ -2703,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/ospf6d/ospf6_route.c b/ospf6d/ospf6_route.c
index 8bfd3b7124..4b87c4cf30 100644
--- a/ospf6d/ospf6_route.c
+++ b/ospf6d/ospf6_route.c
@@ -408,8 +408,6 @@ int ospf6_nexthop_cmp(struct ospf6_nexthop *a, struct ospf6_nexthop *b)
else
return memcmp(&a->address, &b->address,
sizeof(struct in6_addr));
-
- return 0;
}
static int ospf6_path_cmp(struct ospf6_path *a, struct ospf6_path *b)
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_interface.c b/ospfd/ospf_interface.c
index eb7a8348e8..81cc346000 100644
--- a/ospfd/ospf_interface.c
+++ b/ospfd/ospf_interface.c
@@ -477,7 +477,7 @@ struct ospf_interface *ospf_if_lookup_recv_if(struct ospf *ospf,
if (oi->type == OSPF_IFTYPE_VIRTUALLINK)
continue;
- if (if_is_loopback(oi->ifp) || if_is_vrf(oi->ifp))
+ if (if_is_loopback_or_vrf(oi->ifp))
continue;
if (CHECK_FLAG(oi->connected->flags, ZEBRA_IFA_UNNUMBERED))
@@ -719,7 +719,7 @@ static int ospf_if_delete_hook(struct interface *ifp)
int ospf_if_is_enable(struct ospf_interface *oi)
{
- if (!(if_is_loopback(oi->ifp) || if_is_vrf(oi->ifp)))
+ if (!(if_is_loopback_or_vrf(oi->ifp)))
if (if_is_up(oi->ifp))
return 1;
@@ -1291,7 +1291,7 @@ uint8_t ospf_default_iftype(struct interface *ifp)
{
if (if_is_pointopoint(ifp))
return OSPF_IFTYPE_POINTOPOINT;
- else if (if_is_loopback(ifp) || if_is_vrf(ifp))
+ else if (if_is_loopback_or_vrf(ifp))
return OSPF_IFTYPE_LOOPBACK;
else
return OSPF_IFTYPE_BROADCAST;
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_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/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..b09d092458 100644
--- a/watchfrr/watchfrr.c
+++ b/watchfrr/watchfrr.c
@@ -68,6 +68,7 @@ DEFINE_MTYPE_STATIC(WATCHFRR, WATCHFRR_DAEMON, "watchfrr daemon entry");
struct thread_master *master;
static bool watch_only = false;
+const char *pathspace;
typedef enum {
PHASE_NONE = 0,
@@ -361,7 +362,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 +495,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 +832,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 +1019,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 +1265,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;
@@ -1519,8 +1514,15 @@ int main(int argc, char **argv)
else
unsetenv("FRR_PATHSPACE");
+ /*
+ * when watchfrr_di.pathspace is read, if it is not specified
+ * pathspace is NULL as expected
+ */
+ pathspace = watchfrr_di.pathspace;
+
if (netns_en && !netns)
netns = watchfrr_di.pathspace;
+
if (netns_en && netns && netns[0])
netns_setup(netns);
diff --git a/watchfrr/watchfrr.h b/watchfrr/watchfrr.h
index 4df1bf74af..4987a932c0 100644
--- a/watchfrr/watchfrr.h
+++ b/watchfrr/watchfrr.h
@@ -25,6 +25,12 @@
DECLARE_MGROUP(WATCHFRR);
+/*
+ * This is the name of the pathspace we are in `-N XXX`
+ * If the default then this is NULL
+ */
+extern const char *pathspace;
+
extern void watchfrr_vty_init(void);
extern pid_t integrated_write_pid;
diff --git a/watchfrr/watchfrr_vty.c b/watchfrr/watchfrr_vty.c
index eda4f5d516..1492ee37b6 100644
--- a/watchfrr/watchfrr_vty.c
+++ b/watchfrr/watchfrr_vty.c
@@ -105,7 +105,10 @@ DEFUN(config_write_integrated,
/* don't allow the user to pass parameters, we're root here!
* should probably harden vtysh at some point too... */
- execl(VTYSH_BIN_PATH, "vtysh", "-w", NULL);
+ if (pathspace)
+ execl(VTYSH_BIN_PATH, "vtysh", "-N", pathspace, "-w", NULL);
+ else
+ execl(VTYSH_BIN_PATH, "vtysh", "-w", NULL);
/* unbuffered write; we just messed with stdout... */
char msg[512];
diff --git a/yang/frr-nexthop.yang b/yang/frr-nexthop.yang
index 2df2e2958e..adcbacbfea 100644
--- a/yang/frr-nexthop.yang
+++ b/yang/frr-nexthop.yang
@@ -61,7 +61,7 @@ module frr-nexthop {
type union {
type inet:ip-address;
type string {
- pattern "";
+ length "0";
}
}
}
diff --git a/zebra/connected.c b/zebra/connected.c
index 0511b35185..80d434bafc 100644
--- a/zebra/connected.c
+++ b/zebra/connected.c
@@ -73,8 +73,7 @@ static void connected_announce(struct interface *ifp, struct connected *ifc)
if (!ifc)
return;
- if (!if_is_loopback(ifp) && ifc->address->family == AF_INET &&
- !IS_ZEBRA_IF_VRF(ifp)) {
+ if (!if_is_loopback_or_vrf(ifp) && ifc->address->family == AF_INET) {
if (ifc->address->prefixlen == IPV4_MAX_BITLEN)
SET_FLAG(ifc->flags, ZEBRA_IFA_UNNUMBERED);
else
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/rtadv.c b/zebra/rtadv.c
index 976beefab0..9610f71d09 100644
--- a/zebra/rtadv.c
+++ b/zebra/rtadv.c
@@ -493,9 +493,7 @@ static int rtadv_timer(struct thread *thread)
RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id)
FOR_ALL_INTERFACES (vrf, ifp) {
- if (if_is_loopback(ifp)
- || CHECK_FLAG(ifp->status,
- ZEBRA_INTERFACE_VRF_LOOPBACK)
+ if (if_is_loopback_or_vrf(ifp)
|| !if_is_operative(ifp))
continue;
@@ -728,8 +726,7 @@ static void rtadv_process_packet(uint8_t *buf, unsigned int len,
VRF_LOGNAME(vrf), ifp->ifindex, len, addr_str);
}
- if (if_is_loopback(ifp)
- || CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_VRF_LOOPBACK))
+ if (if_is_loopback_or_vrf(ifp))
return;
/* Check interface configuration. */
@@ -1465,8 +1462,7 @@ DEFUN (ipv6_nd_ra_fast_retrans,
VTY_DECLVAR_CONTEXT(interface, ifp);
struct zebra_if *zif = ifp->info;
- if (if_is_loopback(ifp)
- || CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_VRF_LOOPBACK)) {
+ if (if_is_loopback_or_vrf(ifp)) {
vty_out(vty,
"Cannot configure IPv6 Router Advertisements on this interface\n");
return CMD_WARNING_CONFIG_FAILED;
@@ -1488,8 +1484,7 @@ DEFUN (no_ipv6_nd_ra_fast_retrans,
VTY_DECLVAR_CONTEXT(interface, ifp);
struct zebra_if *zif = ifp->info;
- if (if_is_loopback(ifp)
- || CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_VRF_LOOPBACK)) {
+ if (if_is_loopback_or_vrf(ifp)) {
vty_out(vty,
"Cannot configure IPv6 Router Advertisements on this interface\n");
return CMD_WARNING_CONFIG_FAILED;
@@ -1511,8 +1506,7 @@ DEFPY (ipv6_nd_ra_hop_limit,
VTY_DECLVAR_CONTEXT(interface, ifp);
struct zebra_if *zif = ifp->info;
- if (if_is_loopback(ifp)
- || CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_VRF_LOOPBACK)) {
+ if (if_is_loopback_or_vrf(ifp)) {
vty_out(vty,
"Cannot configure IPv6 Router Advertisements on this interface\n");
return CMD_WARNING_CONFIG_FAILED;
@@ -1535,8 +1529,7 @@ DEFPY (no_ipv6_nd_ra_hop_limit,
VTY_DECLVAR_CONTEXT(interface, ifp);
struct zebra_if *zif = ifp->info;
- if (if_is_loopback(ifp)
- || CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_VRF_LOOPBACK)) {
+ if (if_is_loopback_or_vrf(ifp)) {
vty_out(vty,
"Cannot configure IPv6 Router Advertisements on this interface\n");
return CMD_WARNING_CONFIG_FAILED;
@@ -1558,8 +1551,7 @@ DEFPY (ipv6_nd_ra_retrans_interval,
VTY_DECLVAR_CONTEXT(interface, ifp);
struct zebra_if *zif = ifp->info;
- if (if_is_loopback(ifp)
- || CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_VRF_LOOPBACK)) {
+ if (if_is_loopback_or_vrf(ifp)) {
vty_out(vty,
"Cannot configure IPv6 Router Advertisements on loopback interface\n");
return CMD_WARNING_CONFIG_FAILED;
@@ -1582,8 +1574,7 @@ DEFPY (no_ipv6_nd_ra_retrans_interval,
VTY_DECLVAR_CONTEXT(interface, ifp);
struct zebra_if *zif = ifp->info;
- if (if_is_loopback(ifp)
- || CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_VRF_LOOPBACK)) {
+ if (if_is_loopback_or_vrf(ifp)) {
vty_out(vty,
"Cannot remove IPv6 Router Advertisements on loopback interface\n");
return CMD_WARNING_CONFIG_FAILED;
@@ -1604,8 +1595,7 @@ DEFUN (ipv6_nd_suppress_ra,
VTY_DECLVAR_CONTEXT(interface, ifp);
struct zebra_if *zif = ifp->info;
- if (if_is_loopback(ifp)
- || CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_VRF_LOOPBACK)) {
+ if (if_is_loopback_or_vrf(ifp)) {
vty_out(vty,
"Cannot configure IPv6 Router Advertisements on this interface\n");
return CMD_WARNING_CONFIG_FAILED;
@@ -1629,8 +1619,7 @@ DEFUN (no_ipv6_nd_suppress_ra,
VTY_DECLVAR_CONTEXT(interface, ifp);
struct zebra_if *zif = ifp->info;
- if (if_is_loopback(ifp)
- || CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_VRF_LOOPBACK)) {
+ if (if_is_loopback_or_vrf(ifp)) {
vty_out(vty,
"Cannot configure IPv6 Router Advertisements on this interface\n");
return CMD_WARNING_CONFIG_FAILED;
@@ -2619,8 +2608,7 @@ static int rtadv_config_write(struct vty *vty, struct interface *ifp)
zif = ifp->info;
- if (!(if_is_loopback(ifp)
- || CHECK_FLAG(ifp->status, ZEBRA_INTERFACE_VRF_LOOPBACK))) {
+ if (!if_is_loopback_or_vrf(ifp)) {
if (zif->rtadv.AdvSendAdvertisements
&& CHECK_FLAG(zif->rtadv.ra_configured, VTY_RA_CONFIGURED))
vty_out(vty, " no ipv6 nd suppress-ra\n");
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);