summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am2
-rw-r--r--bgpd/bgp_evpn.c20
-rw-r--r--bgpd/bgp_evpn_vty.c2
-rw-r--r--bgpd/bgp_flowspec_vty.c2
-rw-r--r--bgpd/bgp_labelpool.c2
-rw-r--r--bgpd/bgp_main.c2
-rw-r--r--bgpd/bgp_nexthop.c4
-rw-r--r--bgpd/bgp_route.c35
-rw-r--r--bgpd/bgp_routemap.c222
-rw-r--r--bgpd/bgp_rpki.c4
-rw-r--r--bgpd/bgp_zebra.c2
-rw-r--r--bgpd/bgpd.c14
-rw-r--r--bgpd/rfapi/bgp_rfapi_cfg.c14
-rw-r--r--bgpd/rfapi/rfapi.c2
-rw-r--r--bgpd/rfapi/rfapi_rib.c8
-rw-r--r--bgpd/rfapi/rfapi_vty.c2
-rw-r--r--bgpd/rfapi/vnc_export_bgp.c2
-rw-r--r--bgpd/rfapi/vnc_import_bgp.c2
-rw-r--r--bgpd/rfapi/vnc_zebra.c4
-rwxr-xr-xconfigure.ac37
-rw-r--r--debianpkg/backports/ubuntu17.10/debian/control4
-rw-r--r--debianpkg/backports/ubuntu18.04/debian/control4
-rw-r--r--doc/developer/building-frr-for-ubuntu1604.rst4
-rw-r--r--doc/developer/building-frr-for-ubuntu1804.rst4
-rw-r--r--doc/subdir.am2
-rw-r--r--eigrpd/eigrp_dump.c2
-rw-r--r--eigrpd/eigrp_fsm.c14
-rw-r--r--eigrpd/eigrp_interface.c4
-rw-r--r--eigrpd/eigrp_query.c5
-rw-r--r--eigrpd/eigrp_topology.c10
-rw-r--r--eigrpd/eigrp_update.c2
-rw-r--r--eigrpd/eigrpd.c8
-rw-r--r--isisd/isis_circuit.c14
-rw-r--r--isisd/isis_dr.c6
-rw-r--r--isisd/isis_events.c2
-rw-r--r--isisd/isis_lsp.c6
-rw-r--r--isisd/isis_mt.c4
-rw-r--r--isisd/isis_pdu.c2
-rw-r--r--isisd/isis_route.c4
-rw-r--r--isisd/isis_spf.c4
-rw-r--r--isisd/isis_spf_private.h6
-rw-r--r--isisd/isis_tlvs.c2
-rw-r--r--isisd/isisd.c2
-rw-r--r--lib/command.c8
-rw-r--r--lib/command_match.c10
-rw-r--r--lib/ferr.c2
-rw-r--r--lib/frr_pthread.c2
-rw-r--r--lib/grammar_sandbox.c6
-rw-r--r--lib/hash.c2
-rw-r--r--lib/if.c4
-rw-r--r--lib/keychain.c2
-rw-r--r--lib/libfrr.c22
-rw-r--r--lib/linklist.c7
-rw-r--r--lib/linklist.h32
-rw-r--r--lib/lua.c130
-rw-r--r--lib/lua.h79
-rw-r--r--lib/nexthop_group.c2
-rw-r--r--lib/openbsd-tree.c2
-rw-r--r--lib/routemap.c139
-rw-r--r--lib/routemap.h16
-rw-r--r--lib/subdir.am19
-rw-r--r--lib/thread.c4
-rw-r--r--lib/wheel.c2
-rw-r--r--lib/zclient.c2
-rw-r--r--m4/.gitignore1
-rw-r--r--m4/libtool-whole-archive.patch18
-rw-r--r--ospf6d/ospf6_abr.c6
-rw-r--r--ospf6d/ospf6_area.c3
-rw-r--r--ospf6d/ospf6_interface.c2
-rw-r--r--ospf6d/ospf6_route.c6
-rw-r--r--ospf6d/ospf6_spf.c4
-rw-r--r--ospf6d/ospf6_top.c2
-rw-r--r--ospfclient/subdir.am14
-rw-r--r--ospfd/ospf_abr.c6
-rw-r--r--ospfd/ospf_apiserver.c2
-rw-r--r--ospfd/ospf_ase.c6
-rw-r--r--ospfd/ospf_dump.c2
-rw-r--r--ospfd/ospf_dump.h2
-rw-r--r--ospfd/ospf_ext.c2
-rw-r--r--ospfd/ospf_interface.c8
-rw-r--r--ospfd/ospf_ism.c8
-rw-r--r--ospfd/ospf_lsa.c8
-rw-r--r--ospfd/ospf_main.c2
-rw-r--r--ospfd/ospf_opaque.c22
-rw-r--r--ospfd/ospf_packet.c18
-rw-r--r--ospfd/ospf_ri.c4
-rw-r--r--ospfd/ospf_route.c4
-rw-r--r--ospfd/ospf_spf.c6
-rw-r--r--ospfd/ospf_sr.c6
-rw-r--r--ospfd/ospf_te.c2
-rw-r--r--ospfd/ospf_vty.c1
-rw-r--r--ospfd/ospf_zebra.c4
-rw-r--r--ospfd/ospfd.c12
-rw-r--r--pimd/pim_hello.c2
-rw-r--r--pimd/pim_iface.c10
-rw-r--r--pimd/pim_ifchannel.c2
-rw-r--r--pimd/pim_igmp.c4
-rw-r--r--pimd/pim_instance.c2
-rw-r--r--pimd/pim_jp_agg.c6
-rw-r--r--pimd/pim_msdp.c6
-rw-r--r--pimd/pim_neighbor.c4
-rw-r--r--pimd/pim_nht.c2
-rw-r--r--pimd/pim_oil.c2
-rw-r--r--pimd/pim_rp.c6
-rw-r--r--pimd/pim_ssmpingd.c2
-rw-r--r--pimd/pim_tlv.c2
-rw-r--r--pimd/pim_upstream.c12
-rw-r--r--redhat/frr.spec.in2
-rw-r--r--ripd/rip_offset.c2
-rw-r--r--ripd/ripd.c4
-rw-r--r--ripngd/ripng_nexthop.c2
-rw-r--r--ripngd/ripng_offset.c2
-rw-r--r--ripngd/ripngd.c6
-rw-r--r--tests/bgpd/test_bgp_table.c2
-rw-r--r--tests/bgpd/test_peer_attr.c6
-rw-r--r--tests/isisd/test_fuzz_isis_tlv.c2
-rw-r--r--tools/.gitignore1
-rwxr-xr-xtools/frr-reload.py102
-rw-r--r--tools/lua.scr29
-rw-r--r--vtysh/vtysh_config.c4
-rw-r--r--zebra/interface.c8
-rw-r--r--zebra/irdp_interface.c2
-rw-r--r--zebra/label_manager.c2
-rw-r--r--zebra/main.c2
-rw-r--r--zebra/table_manager.c2
-rw-r--r--zebra/zebra_mpls.c6
-rw-r--r--zebra/zebra_rib.c2
-rw-r--r--zebra/zebra_rnh.c4
-rw-r--r--zebra/zebra_vxlan.c4
129 files changed, 1085 insertions, 343 deletions
diff --git a/Makefile.am b/Makefile.am
index fb052a8dea..65aed79152 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -12,6 +12,7 @@ AM_CPPFLAGS = \
-I$(top_builddir) -I$(top_builddir)/include -I$(top_builddir)/lib
AM_LDFLAGS = \
-export-dynamic \
+ $(AC_LDFLAGS) \
$(SAN_FLAGS) \
# end
DEFS = @DEFS@ -DSYSCONFDIR=\"$(sysconfdir)/\" -DCONFDATE=$(CONFDATE)
@@ -154,6 +155,7 @@ EXTRA_DIST += \
aclocal.m4 \
README.md \
m4/README.txt \
+ m4/libtool-whole-archive.patch \
\
python/clidef.py \
python/clippy/__init__.py \
diff --git a/bgpd/bgp_evpn.c b/bgpd/bgp_evpn.c
index 41aceae9f7..c350015cc4 100644
--- a/bgpd/bgp_evpn.c
+++ b/bgpd/bgp_evpn.c
@@ -210,7 +210,7 @@ static void vrf_import_rt_free(struct vrf_irt_node *irt)
}
hash_release(bgp_def->vrf_import_rt_hash, irt);
- list_delete_and_null(&irt->vrfs);
+ list_delete(&irt->vrfs);
XFREE(MTYPE_BGP_EVPN_VRF_IMPORT_RT, irt);
}
@@ -313,7 +313,7 @@ static struct irt_node *import_rt_new(struct bgp *bgp,
static void import_rt_free(struct bgp *bgp, struct irt_node *irt)
{
hash_release(bgp->import_rt_hash, irt);
- list_delete_and_null(&irt->vnis);
+ list_delete(&irt->vnis);
XFREE(MTYPE_BGP_EVPN_IMPORT_RT, irt);
}
@@ -2428,6 +2428,8 @@ static int install_evpn_route_entry_in_vrf(struct bgp *bgp_vrf,
ri->uptime = bgp_clock();
}
+ bgp_aggregate_increment(bgp_vrf, &rn->p, ri, afi, safi);
+
/* Perform route selection and update zebra, if required. */
bgp_process(bgp_vrf, rn, afi, safi);
@@ -2597,6 +2599,8 @@ static int uninstall_evpn_route_entry_in_vrf(struct bgp *bgp_vrf,
if (!ri)
return 0;
+ bgp_aggregate_decrement(bgp_vrf, &rn->p, ri, afi, safi);
+
/* Mark entry for deletion */
bgp_info_delete(rn, ri);
@@ -4984,8 +4988,8 @@ void bgp_evpn_free(struct bgp *bgp, struct bgpevpn *vpn)
bgpevpn_unlink_from_l3vni(vpn);
bgp_table_unlock(vpn->route_table);
bgp_evpn_unmap_vni_from_its_rts(bgp, vpn);
- list_delete_and_null(&vpn->import_rtl);
- list_delete_and_null(&vpn->export_rtl);
+ list_delete(&vpn->import_rtl);
+ list_delete(&vpn->export_rtl);
bf_release_index(bm->rd_idspace, vpn->rd_id);
hash_release(bgp->vnihash, vpn);
QOBJ_UNREG(vpn);
@@ -5058,7 +5062,7 @@ struct evpnes *bgp_evpn_es_new(struct bgp *bgp,
*/
void bgp_evpn_es_free(struct bgp *bgp, struct evpnes *es)
{
- list_delete_and_null(&es->vtep_list);
+ list_delete(&es->vtep_list);
bgp_table_unlock(es->route_table);
bf_release_index(bm->rd_idspace, es->rd_id);
hash_release(bgp->esihash, es);
@@ -5627,9 +5631,9 @@ void bgp_evpn_cleanup(struct bgp *bgp)
hash_free(bgp->esihash);
bgp->esihash = NULL;
- list_delete_and_null(&bgp->vrf_import_rtl);
- list_delete_and_null(&bgp->vrf_export_rtl);
- list_delete_and_null(&bgp->l2vnis);
+ list_delete(&bgp->vrf_import_rtl);
+ list_delete(&bgp->vrf_export_rtl);
+ list_delete(&bgp->l2vnis);
}
/*
diff --git a/bgpd/bgp_evpn_vty.c b/bgpd/bgp_evpn_vty.c
index 6f907c3ab5..5a1e8edac4 100644
--- a/bgpd/bgp_evpn_vty.c
+++ b/bgpd/bgp_evpn_vty.c
@@ -4862,7 +4862,7 @@ void bgp_config_write_evpn_info(struct vty *vty, struct bgp *bgp, afi_t afi,
for (ALL_LIST_ELEMENTS_RO(vnilist, ln, data))
write_vni_config(vty, data);
- list_delete_and_null(&vnilist);
+ list_delete(&vnilist);
}
if (bgp->advertise_all_vni)
diff --git a/bgpd/bgp_flowspec_vty.c b/bgpd/bgp_flowspec_vty.c
index faa88f9850..ceeecc7e19 100644
--- a/bgpd/bgp_flowspec_vty.c
+++ b/bgpd/bgp_flowspec_vty.c
@@ -357,7 +357,7 @@ void route_vty_out_flowspec(struct vty *vty, struct prefix *p,
if (list_began)
vty_out(vty, ")");
vty_out(vty, "\n");
- list_delete_and_null(&list_bpm);
+ list_delete(&list_bpm);
} else
vty_out(vty, "\tnot installed in PBR\n");
}
diff --git a/bgpd/bgp_labelpool.c b/bgpd/bgp_labelpool.c
index 73d3dc67e8..181f864575 100644
--- a/bgpd/bgp_labelpool.c
+++ b/bgpd/bgp_labelpool.c
@@ -223,7 +223,7 @@ void bgp_lp_finish(void)
skiplist_free(lp->inuse);
lp->inuse = NULL;
- list_delete_and_null(&lp->chunks);
+ list_delete(&lp->chunks);
while ((lf = LABEL_FIFO_HEAD(lp->requests))) {
diff --git a/bgpd/bgp_main.c b/bgpd/bgp_main.c
index 6643795f55..503c3f9f88 100644
--- a/bgpd/bgp_main.c
+++ b/bgpd/bgp_main.c
@@ -234,7 +234,7 @@ static __attribute__((__noreturn__)) void bgp_exit(int status)
bgp_zebra_destroy();
bf_free(bm->rd_idspace);
- list_delete_and_null(&bm->bgp);
+ list_delete(&bm->bgp);
memset(bm, 0, sizeof(*bm));
frr_fini();
diff --git a/bgpd/bgp_nexthop.c b/bgpd/bgp_nexthop.c
index 64453987d5..ce7f5b40f5 100644
--- a/bgpd/bgp_nexthop.c
+++ b/bgpd/bgp_nexthop.c
@@ -226,7 +226,7 @@ static void bgp_address_hash_free(void *data)
{
struct bgp_addr *addr = data;
- list_delete_and_null(&addr->ifp_name_list);
+ list_delete(&addr->ifp_name_list);
XFREE(MTYPE_BGP_ADDR, addr);
}
@@ -308,7 +308,7 @@ static void bgp_address_del(struct bgp *bgp, struct connected *ifc,
if (addr->ifp_name_list->count == 0) {
hash_release(bgp->address_hash, addr);
- list_delete_and_null(&addr->ifp_name_list);
+ list_delete(&addr->ifp_name_list);
XFREE(MTYPE_BGP_ADDR, addr);
}
}
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index a04ed8eef5..715393b91d 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -215,7 +215,7 @@ static void bgp_info_extra_free(struct bgp_info_extra **extra)
bgp_unlock(e->bgp_orig);
if ((*extra)->bgp_fs_pbr)
- list_delete_and_null(&((*extra)->bgp_fs_pbr));
+ list_delete(&((*extra)->bgp_fs_pbr));
XFREE(MTYPE_BGP_ROUTE_EXTRA, *extra);
*extra = NULL;
@@ -2775,30 +2775,40 @@ static bool overlay_index_equal(afi_t afi, struct bgp_info *info,
{
struct eth_segment_id *info_eth_s_id, *info_eth_s_id_remote;
union gw_addr *info_gw_ip, *info_gw_ip_remote;
- char temp[16];
+ union {
+ struct eth_segment_id esi;
+ union gw_addr ip;
+ } temp;
if (afi != AFI_L2VPN)
return true;
if (!info->attr) {
- memset(&temp, 0, 16);
- info_eth_s_id = (struct eth_segment_id *)&temp;
- info_gw_ip = (union gw_addr *)&temp;
+ memset(&temp, 0, sizeof(temp));
+ info_eth_s_id = &temp.esi;
+ info_gw_ip = &temp.ip;
+
if (eth_s_id == NULL && gw_ip == NULL)
return true;
} else {
info_eth_s_id = &(info->attr->evpn_overlay.eth_s_id);
info_gw_ip = &(info->attr->evpn_overlay.gw_ip);
}
- if (gw_ip == NULL)
- info_gw_ip_remote = (union gw_addr *)&temp;
- else
+
+ if (gw_ip == NULL) {
+ memset(&temp, 0, sizeof(temp));
+ info_gw_ip_remote = &temp.ip;
+ } else
info_gw_ip_remote = gw_ip;
- if (eth_s_id == NULL)
- info_eth_s_id_remote = (struct eth_segment_id *)&temp;
- else
+
+ if (eth_s_id == NULL) {
+ memset(&temp, 0, sizeof(temp));
+ info_eth_s_id_remote = &temp.esi;
+ } else
info_eth_s_id_remote = eth_s_id;
+
if (!memcmp(info_gw_ip, info_gw_ip_remote, sizeof(union gw_addr)))
return false;
+
return !memcmp(info_eth_s_id, info_eth_s_id_remote,
sizeof(struct eth_segment_id));
}
@@ -5478,6 +5488,9 @@ static int bgp_aggregate_info_same(struct bgp_info *ri, uint8_t origin,
if (!community_cmp(ri->attr->community, comm))
return 0;
+ if (!CHECK_FLAG(ri->flags, BGP_INFO_VALID))
+ return 0;
+
return 1;
}
diff --git a/bgpd/bgp_routemap.c b/bgpd/bgp_routemap.c
index 0b4355805c..0a3e4b3c89 100644
--- a/bgpd/bgp_routemap.c
+++ b/bgpd/bgp_routemap.c
@@ -28,6 +28,7 @@
#include "plist.h"
#include "memory.h"
#include "log.h"
+#include "lua.h"
#ifdef HAVE_LIBPCREPOSIX
#include <pcreposix.h>
#else
@@ -330,6 +331,102 @@ struct route_map_rule_cmd route_match_peer_cmd = {"peer", route_match_peer,
route_match_peer_compile,
route_match_peer_free};
+#if defined(HAVE_LUA)
+static route_map_result_t route_match_command(void *rule,
+ const struct prefix *prefix,
+ route_map_object_t type,
+ void *object)
+{
+ int status = RMAP_NOMATCH;
+ u_int32_t locpref = 0;
+ u_int32_t newlocpref = 0;
+ enum lua_rm_status lrm_status;
+ struct bgp_info *info = (struct bgp_info *)object;
+ lua_State *L = lua_initialize("/etc/frr/lua.scr");
+
+ if (L == NULL)
+ return status;
+
+ /*
+ * Setup the prefix information to pass in
+ */
+ lua_setup_prefix_table(L, prefix);
+
+ zlog_debug("Set up prefix table");
+ /*
+ * Setup the bgp_info information
+ */
+ lua_newtable(L);
+ lua_pushinteger(L, info->attr->med);
+ lua_setfield(L, -2, "metric");
+ lua_pushinteger(L, info->attr->nh_ifindex);
+ lua_setfield(L, -2, "ifindex");
+ lua_pushstring(L, info->attr->aspath->str);
+ lua_setfield(L, -2, "aspath");
+ lua_pushinteger(L, info->attr->local_pref);
+ lua_setfield(L, -2, "localpref");
+ zlog_debug("%s %d", info->attr->aspath->str, info->attr->nh_ifindex);
+ lua_setglobal(L, "nexthop");
+
+ zlog_debug("Set up nexthop information");
+ /*
+ * Run the rule
+ */
+ lrm_status = lua_run_rm_rule(L, rule);
+ switch (lrm_status) {
+ case LUA_RM_FAILURE:
+ zlog_debug("RM_FAILURE");
+ break;
+ case LUA_RM_NOMATCH:
+ zlog_debug("RM_NOMATCH");
+ break;
+ case LUA_RM_MATCH_AND_CHANGE:
+ zlog_debug("MATCH AND CHANGE");
+ lua_getglobal(L, "nexthop");
+ info->attr->med = get_integer(L, "metric");
+ /*
+ * This needs to be abstraced with the set function
+ */
+ if (info->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF))
+ locpref = info->attr->local_pref;
+ newlocpref = get_integer(L, "localpref");
+ if (newlocpref != locpref) {
+ info->attr->flag |= ATTR_FLAG_BIT(BGP_ATTR_LOCAL_PREF);
+ info->attr->local_pref = newlocpref;
+ }
+ status = RMAP_MATCH;
+ break;
+ case LUA_RM_MATCH:
+ zlog_debug("MATCH ONLY");
+ status = RMAP_MATCH;
+ break;
+ }
+ lua_close(L);
+ return status;
+}
+
+static void *route_match_command_compile(const char *arg)
+{
+ char *command;
+
+ command = XSTRDUP(MTYPE_ROUTE_MAP_COMPILED, arg);
+ return command;
+}
+
+static void
+route_match_command_free(void *rule)
+{
+ XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);
+}
+
+struct route_map_rule_cmd route_match_command_cmd = {
+ "command",
+ route_match_command,
+ route_match_command_compile,
+ route_match_command_free
+};
+#endif
+
/* `match ip address IP_ACCESS_LIST' */
/* Match function should return 1 if match is success else return
@@ -548,6 +645,45 @@ struct route_map_rule_cmd route_match_ip_next_hop_prefix_list_cmd = {
route_match_ip_next_hop_prefix_list_compile,
route_match_ip_next_hop_prefix_list_free};
+/* `match ip next-hop type <blackhole>' */
+
+static route_map_result_t
+route_match_ip_next_hop_type(void *rule, const struct prefix *prefix,
+ route_map_object_t type, void *object)
+{
+ struct bgp_info *bgp_info;
+
+ if (type == RMAP_BGP && prefix->family == AF_INET) {
+ bgp_info = (struct bgp_info *)object;
+ if (!bgp_info || !bgp_info->attr)
+ return RMAP_DENYMATCH;
+
+ /* If nexthop interface's index can't be resolved and nexthop is
+ set to any address then mark it as type `blackhole`.
+ This logic works for matching kernel/static routes like:
+ `ip route add blackhole 10.0.0.1`. */
+ if (bgp_info->attr->nexthop.s_addr == INADDR_ANY
+ && !bgp_info->attr->nh_ifindex)
+ return RMAP_MATCH;
+ }
+ return RMAP_NOMATCH;
+}
+
+static void *route_match_ip_next_hop_type_compile(const char *arg)
+{
+ return XSTRDUP(MTYPE_ROUTE_MAP_COMPILED, arg);
+}
+
+static void route_match_ip_next_hop_type_free(void *rule)
+{
+ XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);
+}
+
+static struct route_map_rule_cmd route_match_ip_next_hop_type_cmd = {
+ "ip next-hop type", route_match_ip_next_hop_type,
+ route_match_ip_next_hop_type_compile,
+ route_match_ip_next_hop_type_free};
+
/* `match ip route-source prefix-list PREFIX_LIST' */
static route_map_result_t
@@ -2372,6 +2508,53 @@ struct route_map_rule_cmd route_match_ipv6_address_prefix_list_cmd = {
route_match_ipv6_address_prefix_list_compile,
route_match_ipv6_address_prefix_list_free};
+/* `match ipv6 next-hop type <TYPE>' */
+
+static route_map_result_t
+route_match_ipv6_next_hop_type(void *rule, const struct prefix *prefix,
+ route_map_object_t type, void *object)
+{
+ struct bgp_info *bgp_info;
+ struct in6_addr *addr = rule;
+
+ if (type == RMAP_BGP && prefix->family == AF_INET6) {
+ bgp_info = (struct bgp_info *)object;
+ if (!bgp_info || !bgp_info->attr)
+ return RMAP_DENYMATCH;
+
+ if (IPV6_ADDR_SAME(&bgp_info->attr->mp_nexthop_global, addr)
+ && !bgp_info->attr->nh_ifindex)
+ return RMAP_MATCH;
+ }
+ return RMAP_NOMATCH;
+}
+
+static void *route_match_ipv6_next_hop_type_compile(const char *arg)
+{
+ struct in6_addr *address;
+ int ret;
+
+ address = XMALLOC(MTYPE_ROUTE_MAP_COMPILED, sizeof(struct in6_addr));
+
+ ret = inet_pton(AF_INET6, "::0", address);
+ if (!ret) {
+ XFREE(MTYPE_ROUTE_MAP_COMPILED, address);
+ return NULL;
+ }
+
+ return address;
+}
+
+static void route_match_ipv6_next_hop_type_free(void *rule)
+{
+ XFREE(MTYPE_ROUTE_MAP_COMPILED, rule);
+}
+
+struct route_map_rule_cmd route_match_ipv6_next_hop_type_cmd = {
+ "ipv6 next-hop type", route_match_ipv6_next_hop_type,
+ route_match_ipv6_next_hop_type_compile,
+ route_match_ipv6_next_hop_type_free};
+
/* `set ipv6 nexthop global IP_ADDRESS' */
/* Set nexthop to object. ojbect must be pointer to struct attr. */
@@ -3356,6 +3539,30 @@ DEFUN (no_match_peer,
RMAP_EVENT_MATCH_DELETED);
}
+#if defined(HAVE_LUA)
+DEFUN (match_command,
+ match_command_cmd,
+ "match command WORD",
+ MATCH_STR
+ "Run a command to match\n"
+ "The command to run\n")
+{
+ return bgp_route_match_add(vty, "command", argv[2]->arg,
+ RMAP_EVENT_FILTER_ADDED);
+}
+
+DEFUN (no_match_command,
+ no_match_command_cmd,
+ "no match command WORD",
+ NO_STR
+ MATCH_STR
+ "Run a command to match\n"
+ "The command to run\n")
+{
+ return bgp_route_match_delete(vty, "command", argv[3]->arg,
+ RMAP_EVENT_FILTER_DELETED);
+}
+#endif
/* match probability */
DEFUN (match_probability,
@@ -4645,12 +4852,18 @@ void bgp_route_map_init(void)
route_map_match_ip_next_hop_prefix_list_hook(generic_match_add);
route_map_no_match_ip_next_hop_prefix_list_hook(generic_match_delete);
+ route_map_match_ip_next_hop_type_hook(generic_match_add);
+ route_map_no_match_ip_next_hop_type_hook(generic_match_delete);
+
route_map_match_ipv6_address_hook(generic_match_add);
route_map_no_match_ipv6_address_hook(generic_match_delete);
route_map_match_ipv6_address_prefix_list_hook(generic_match_add);
route_map_no_match_ipv6_address_prefix_list_hook(generic_match_delete);
+ route_map_match_ipv6_next_hop_type_hook(generic_match_add);
+ route_map_no_match_ipv6_next_hop_type_hook(generic_match_delete);
+
route_map_match_metric_hook(generic_match_add);
route_map_no_match_metric_hook(generic_match_delete);
@@ -4671,11 +4884,15 @@ void bgp_route_map_init(void)
route_map_install_match(&route_match_peer_cmd);
route_map_install_match(&route_match_local_pref_cmd);
+#if defined(HAVE_LUA)
+ route_map_install_match(&route_match_command_cmd);
+#endif
route_map_install_match(&route_match_ip_address_cmd);
route_map_install_match(&route_match_ip_next_hop_cmd);
route_map_install_match(&route_match_ip_route_source_cmd);
route_map_install_match(&route_match_ip_address_prefix_list_cmd);
route_map_install_match(&route_match_ip_next_hop_prefix_list_cmd);
+ route_map_install_match(&route_match_ip_next_hop_type_cmd);
route_map_install_match(&route_match_ip_route_source_prefix_list_cmd);
route_map_install_match(&route_match_aspath_cmd);
route_map_install_match(&route_match_community_cmd);
@@ -4791,6 +5008,7 @@ void bgp_route_map_init(void)
route_map_install_match(&route_match_ipv6_address_cmd);
route_map_install_match(&route_match_ipv6_next_hop_cmd);
route_map_install_match(&route_match_ipv6_address_prefix_list_cmd);
+ route_map_install_match(&route_match_ipv6_next_hop_type_cmd);
route_map_install_set(&route_set_ipv6_nexthop_global_cmd);
route_map_install_set(&route_set_ipv6_nexthop_prefer_global_cmd);
route_map_install_set(&route_set_ipv6_nexthop_local_cmd);
@@ -4804,6 +5022,10 @@ void bgp_route_map_init(void)
install_element(RMAP_NODE, &no_set_ipv6_nexthop_prefer_global_cmd);
install_element(RMAP_NODE, &set_ipv6_nexthop_peer_cmd);
install_element(RMAP_NODE, &no_set_ipv6_nexthop_peer_cmd);
+#if defined(HAVE_LUA)
+ install_element(RMAP_NODE, &match_command_cmd);
+ install_element(RMAP_NODE, &no_match_command_cmd);
+#endif
}
void bgp_route_map_terminate(void)
diff --git a/bgpd/bgp_rpki.c b/bgpd/bgp_rpki.c
index 2e0bb1ae62..56566525a4 100644
--- a/bgpd/bgp_rpki.c
+++ b/bgpd/bgp_rpki.c
@@ -402,7 +402,7 @@ static int bgpd_sync_callback(struct thread *thread)
revalidate_bgp_node(bgp_node, afi,
safi);
- list_delete_and_null(&matches);
+ list_delete(&matches);
}
}
}
@@ -539,7 +539,7 @@ static int bgp_rpki_init(struct thread_master *master)
static int bgp_rpki_fini(void)
{
stop();
- list_delete_and_null(&cache_list);
+ list_delete(&cache_list);
close(rpki_sync_socket_rtr);
close(rpki_sync_socket_bgpd);
diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c
index 5ab727111c..5a5c7c9861 100644
--- a/bgpd/bgp_zebra.c
+++ b/bgpd/bgp_zebra.c
@@ -1580,7 +1580,7 @@ static void bgp_redist_del(struct bgp *bgp, afi_t afi, uint8_t type,
listnode_delete(bgp->redist[afi][type], red);
XFREE(MTYPE_BGP_REDIST, red);
if (!bgp->redist[afi][type]->count)
- list_delete_and_null(&bgp->redist[afi][type]);
+ list_delete(&bgp->redist[afi][type]);
}
}
diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c
index e4dedc2420..5bbb83e327 100644
--- a/bgpd/bgpd.c
+++ b/bgpd/bgpd.c
@@ -2426,14 +2426,14 @@ int peer_group_delete(struct peer_group *group)
peer_delete(other);
}
}
- list_delete_and_null(&group->peer);
+ list_delete(&group->peer);
for (afi = AFI_IP; afi < AFI_MAX; afi++) {
for (ALL_LIST_ELEMENTS(group->listen_range[afi], node, nnode,
prefix)) {
prefix_free(prefix);
}
- list_delete_and_null(&group->listen_range[afi]);
+ list_delete(&group->listen_range[afi]);
}
XFREE(MTYPE_PEER_GROUP_HOST, group->name);
@@ -3221,8 +3221,8 @@ void bgp_free(struct bgp *bgp)
QOBJ_UNREG(bgp);
- list_delete_and_null(&bgp->group);
- list_delete_and_null(&bgp->peer);
+ list_delete(&bgp->group);
+ list_delete(&bgp->peer);
if (bgp->peerhash) {
hash_free(bgp->peerhash);
@@ -3264,9 +3264,9 @@ void bgp_free(struct bgp *bgp)
vpn_policy_direction_t dir;
if (bgp->vpn_policy[afi].import_vrf)
- list_delete_and_null(&bgp->vpn_policy[afi].import_vrf);
+ list_delete(&bgp->vpn_policy[afi].import_vrf);
if (bgp->vpn_policy[afi].export_vrf)
- list_delete_and_null(&bgp->vpn_policy[afi].export_vrf);
+ list_delete(&bgp->vpn_policy[afi].export_vrf);
dir = BGP_VPN_POLICY_DIR_FROMVPN;
if (bgp->vpn_policy[afi].rtlist[dir])
@@ -7864,7 +7864,7 @@ void bgp_terminate(void)
bgp_close();
if (bm->listen_sockets)
- list_delete_and_null(&bm->listen_sockets);
+ list_delete(&bm->listen_sockets);
for (ALL_LIST_ELEMENTS(bm->bgp, mnode, mnnode, bgp))
for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer))
diff --git a/bgpd/rfapi/bgp_rfapi_cfg.c b/bgpd/rfapi/bgp_rfapi_cfg.c
index 15e3974248..cb45fc8da4 100644
--- a/bgpd/rfapi/bgp_rfapi_cfg.c
+++ b/bgpd/rfapi/bgp_rfapi_cfg.c
@@ -2290,7 +2290,7 @@ static void bgp_rfapi_delete_nve_group(struct vty *vty, /* NULL = no output */
listnode_delete(rfg->nves, rfd);
listnode_add(orphaned_nves, rfd);
}
- list_delete_and_null(&rfg->nves);
+ list_delete(&rfg->nves);
}
/* delete it */
@@ -2367,7 +2367,7 @@ static void bgp_rfapi_delete_nve_group(struct vty *vty, /* NULL = no output */
if (vty)
vty_out(vty, "\n");
}
- list_delete_and_null(&orphaned_nves);
+ list_delete(&orphaned_nves);
}
}
@@ -3395,7 +3395,7 @@ static void bgp_rfapi_delete_l2_group(struct vty *vty, /* NULL = no output */
if (rfg->rt_export_list)
ecommunity_free(&rfg->rt_export_list);
if (rfg->labels)
- list_delete_and_null(&rfg->labels);
+ list_delete(&rfg->labels);
if (rfg->rfp_cfg)
XFREE(MTYPE_RFAPI_RFP_GROUP_CFG, rfg->rfp_cfg);
listnode_delete(bgp->rfapi_cfg->l2_groups, rfg);
@@ -3809,10 +3809,10 @@ void bgp_rfapi_cfg_destroy(struct bgp *bgp, struct rfapi_cfg *h)
bgp_rfapi_delete_named_nve_group(NULL, bgp, NULL, RFAPI_GROUP_CFG_MAX);
bgp_rfapi_delete_named_l2_group(NULL, bgp, NULL);
if (h->l2_groups != NULL)
- list_delete_and_null(&h->l2_groups);
- list_delete_and_null(&h->nve_groups_sequential);
- list_delete_and_null(&h->rfg_export_direct_bgp_l);
- list_delete_and_null(&h->rfg_export_zebra_l);
+ list_delete(&h->l2_groups);
+ list_delete(&h->nve_groups_sequential);
+ list_delete(&h->rfg_export_direct_bgp_l);
+ list_delete(&h->rfg_export_zebra_l);
if (h->default_rt_export_list)
ecommunity_free(&h->default_rt_export_list);
if (h->default_rt_import_list)
diff --git a/bgpd/rfapi/rfapi.c b/bgpd/rfapi/rfapi.c
index 16dcbd4ee7..c7c2239db7 100644
--- a/bgpd/rfapi/rfapi.c
+++ b/bgpd/rfapi/rfapi.c
@@ -483,7 +483,7 @@ void del_vnc_route(struct rfapi_descriptor *rfd,
* Delete local_nexthops list
*/
if (bi->extra && bi->extra->vnc.export.local_nexthops) {
- list_delete_and_null(
+ list_delete(
&bi->extra->vnc.export.local_nexthops);
}
diff --git a/bgpd/rfapi/rfapi_rib.c b/bgpd/rfapi/rfapi_rib.c
index 008da30118..fa8c038d6f 100644
--- a/bgpd/rfapi/rfapi_rib.c
+++ b/bgpd/rfapi/rfapi_rib.c
@@ -508,7 +508,7 @@ void rfapiRibClear(struct rfapi_descriptor *rfd)
*/
if (pn->info) {
if (pn->info != (void *)1) {
- list_delete_and_null(
+ list_delete(
(struct list *
*)(&pn->info));
}
@@ -1433,7 +1433,7 @@ callback:
}
delete_list->del = (void (*)(void *))rfapi_info_free;
- list_delete_and_null(&delete_list);
+ list_delete(&delete_list);
}
RFAPI_RIB_CHECK_COUNTS(0, 0);
@@ -1448,7 +1448,7 @@ callback:
agg_unlock_node(pn);
}
if (lPendCost) {
- list_delete_and_null(&lPendCost);
+ list_delete(&lPendCost);
pn->info = NULL;
agg_unlock_node(pn);
}
@@ -1633,7 +1633,7 @@ void rfapiRibUpdatePendingNode(
*/
if (pn->info) {
if (pn->info != (void *)1) {
- list_delete_and_null((struct list **)(&pn->info));
+ list_delete((struct list **)(&pn->info));
}
pn->info = NULL;
agg_unlock_node(pn); /* linklist or 1 deleted */
diff --git a/bgpd/rfapi/rfapi_vty.c b/bgpd/rfapi/rfapi_vty.c
index 1dc2d02f15..1af9479a6a 100644
--- a/bgpd/rfapi/rfapi_vty.c
+++ b/bgpd/rfapi/rfapi_vty.c
@@ -3268,7 +3268,7 @@ static int rfapiDeleteLocalPrefixesByRFD(struct rfapi_local_reg_delete_arg *cda,
}
list_delete_all_node(adb_delete_list);
}
- list_delete_and_null(&adb_delete_list);
+ list_delete(&adb_delete_list);
}
diff --git a/bgpd/rfapi/vnc_export_bgp.c b/bgpd/rfapi/vnc_export_bgp.c
index f830c3ed52..6fcae17a8a 100644
--- a/bgpd/rfapi/vnc_export_bgp.c
+++ b/bgpd/rfapi/vnc_export_bgp.c
@@ -1610,7 +1610,7 @@ void vnc_direct_bgp_vpn_disable(struct bgp *bgp, afi_t afi)
if (nve_list) {
vnc_direct_bgp_unexport_table(
afi, it->imported_vpn[afi], nve_list);
- list_delete_and_null(&nve_list);
+ list_delete(&nve_list);
}
}
}
diff --git a/bgpd/rfapi/vnc_import_bgp.c b/bgpd/rfapi/vnc_import_bgp.c
index 71a4485d39..8a286d1377 100644
--- a/bgpd/rfapi/vnc_import_bgp.c
+++ b/bgpd/rfapi/vnc_import_bgp.c
@@ -2404,7 +2404,7 @@ void vnc_import_bgp_exterior_add_route_interior(
skiplist_delete(it->monitor_exterior_orphans,
an_bi_exterior, NULL);
}
- list_delete_and_null(&list_adopted);
+ list_delete(&list_adopted);
}
}
diff --git a/bgpd/rfapi/vnc_zebra.c b/bgpd/rfapi/vnc_zebra.c
index 1db1755368..fdd200ac37 100644
--- a/bgpd/rfapi/vnc_zebra.c
+++ b/bgpd/rfapi/vnc_zebra.c
@@ -596,7 +596,7 @@ static void vnc_zebra_add_del_prefix(struct bgp *bgp,
nve_list_to_nh_array(rn->p.family, nves, &nexthop_count,
&nh_ary, &nhp_ary);
- list_delete_and_null(&nves);
+ list_delete(&nves);
if (nexthop_count)
vnc_zebra_route_msg(&rn->p, nexthop_count, nhp_ary,
@@ -768,7 +768,7 @@ static void vnc_zebra_add_del_group_afi(struct bgp *bgp,
vnc_zlog_debug_verbose("%s: family: %d, nve count: %d",
__func__, family, nexthop_count);
- list_delete_and_null(&nves);
+ list_delete(&nves);
if (nexthop_count) {
/*
diff --git a/configure.ac b/configure.ac
index 3d17293a94..12100121d6 100755
--- a/configure.ac
+++ b/configure.ac
@@ -203,7 +203,15 @@ elif test "x${enable_dev_build}" = "xyes"; then
AC_C_FLAG([-g3])
AC_C_FLAG([-O0])
fi
+ if test "x${enable_lua}" = "xyes"; then
+ AC_CHECK_LIB([lua], [lua_newstate],
+ [LIBS="$LIBS -llua"])
+ AC_DEFINE(HAVE_LUA,,Lua enabled for development)
+ fi
else
+ if test "x${enable_lua}" = "xyes"; then
+ AC_MSG_ERROR([Lua is not meant to be built/used outside of development at this time])
+ fi
if test "z$orig_cflags" = "z"; then
AC_C_FLAG([-g])
AC_C_FLAG([-Os], [
@@ -302,7 +310,18 @@ AC_CHECK_TOOL(AR, ar)
dnl -------
dnl libtool
dnl -------
+AC_ARG_ENABLE(static-bin,
+ AS_HELP_STRING([--enable-static-bin], [link binaries statically]))
LT_INIT
+_LT_CONFIG_LIBTOOL([
+ patch -N -i "${srcdir}/m4/libtool-whole-archive.patch" libtool >&AS_MESSAGE_LOG_FD || \
+ AC_MSG_WARN([Could not patch libtool for static linking support. Loading modules into a statically linked daemon will fail.])
+])
+if test "$enable_static_bin" = "yes"; then
+ AC_LDFLAGS="-static"
+fi
+AC_SUBST(AC_LDFLAGS)
+AM_CONDITIONAL([STATIC_BIN], [test "x$enable_static_bin" = "xyes"])
dnl ----------------------
dnl Packages configuration
@@ -454,6 +473,9 @@ fi
AC_ARG_ENABLE([dev_build],
AS_HELP_STRING([--enable-dev-build], [build for development]))
+AC_ARG_ENABLE([lua],
+ AS_HELP_STRING([--enable-lua], [Build Lua scripting]))
+
if test x"${enable_time_check}" != x"no" ; then
if test x"${enable_time_check}" = x"yes" -o x"${enable_time_check}" = x ; then
AC_DEFINE(CONSUMED_TIME_CHECK,5000000,Consumed Time Check)
@@ -730,6 +752,20 @@ if test "x$with_pkg_git_version" = "xyes"; then
fi
AM_CONDITIONAL([GIT_VERSION], [test "x$with_pkg_git_version" = "xyes"])
+AC_CHECK_TOOL([OBJCOPY], [objcopy], [:])
+AC_CACHE_CHECK([for .interp value to use], [frr_cv_interp], [
+ frr_cv_interp=""
+ AC_LINK_IFELSE([AC_LANG_SOURCE([[int main() { return 0; }]])], [
+ if $OBJCOPY -j.interp -Obinary conftest conftest.interp; then
+ frr_cv_interp="`xargs -0 echo < conftest.interp`"
+ fi
+ test -f conftest.interp && rm conftest.interp
+ ])
+])
+if test -n "$frr_cv_interp"; then
+ AC_DEFINE_UNQUOTED(INTERP, ["$frr_cv_interp"], [.interp value])
+fi
+
dnl ------------------------------------
dnl Check C keywords and standard types
dnl ------------------------------------
@@ -1126,6 +1162,7 @@ if test x"$LIBM" = x ; then
AC_MSG_WARN([Unable to find working pow function - bgpd may not link])
fi
LIBS="$TMPLIBS"
+
AC_SUBST(LIBM)
AC_CHECK_FUNCS([ppoll], [
diff --git a/debianpkg/backports/ubuntu17.10/debian/control b/debianpkg/backports/ubuntu17.10/debian/control
index 1bc3c4e4b5..ce73f9d1b0 100644
--- a/debianpkg/backports/ubuntu17.10/debian/control
+++ b/debianpkg/backports/ubuntu17.10/debian/control
@@ -4,7 +4,7 @@ Priority: optional
Maintainer: Nobody <nobody@frrouting.org>
Uploaders: Nobody <nobody@frrouting.org>
XSBC-Original-Maintainer: <maintainers@frrouting.org>
-Build-Depends: debhelper (>= 7.0.50~), libncurses5-dev, libreadline-dev, texlive-latex-base, texlive-generic-recommended, libpam0g-dev | libpam-dev, libcap-dev, texinfo (>= 4.7), imagemagick, ghostscript, groff, autotools-dev, libpcre3-dev, gawk, chrpath, libsnmp-dev, git, dh-autoreconf, libjson-c-dev, libjson-c2 | libjson-c3, dh-systemd, libsystemd-dev, bison, flex, libc-ares-dev, pkg-config, python (>= 2.7), python-ipaddr, libpython-dev
+Build-Depends: debhelper (>= 7.0.50~), libncurses5-dev, libreadline-dev, texlive-latex-base, texlive-generic-recommended, libpam0g-dev | libpam-dev, libcap-dev, texinfo (>= 4.7), imagemagick, ghostscript, groff, autotools-dev, libpcre3-dev, gawk, chrpath, libsnmp-dev, git, dh-autoreconf, libjson-c-dev, libjson-c2 | libjson-c3, dh-systemd, libsystemd-dev, bison, flex, libc-ares-dev, pkg-config, python (>= 2.7), python-ipaddress, libpython-dev
Standards-Version: 3.9.6
Homepage: http://www.frrouting.org/
@@ -47,7 +47,7 @@ Description: BGP/OSPF/RIP/RIPng/ISIS/PIM/LDP routing daemon (documentation)
Package: frr-pythontools
Section: net
Architecture: all
-Depends: ${misc:Depends}, frr (= ${binary:Version}), python (>= 2.7), python-ipaddr
+Depends: ${misc:Depends}, frr (= ${binary:Version}), python (>= 2.7), python-ipaddress
Description: BGP/OSPF/RIP/RIPng/ISIS/PIM/LDP routing daemon (Python Tools)
This package includes info files for frr, a free software which manages
TCP/IP based routing protocols. It supports BGP4, BGP4+, OSPFv2, OSPFv3,
diff --git a/debianpkg/backports/ubuntu18.04/debian/control b/debianpkg/backports/ubuntu18.04/debian/control
index 1e31ad6d51..3fccb46b7a 100644
--- a/debianpkg/backports/ubuntu18.04/debian/control
+++ b/debianpkg/backports/ubuntu18.04/debian/control
@@ -4,7 +4,7 @@ Priority: optional
Maintainer: Nobody <nobody@frrouting.org>
Uploaders: Nobody <nobody@frrouting.org>
XSBC-Original-Maintainer: <maintainers@frrouting.org>
-Build-Depends: debhelper (>= 7.0.50~), libncurses5-dev, libreadline-dev, texlive-latex-base, texlive-generic-recommended, libpam0g-dev | libpam-dev, libcap-dev, texinfo (>= 4.7), imagemagick, ghostscript, groff, autotools-dev, libpcre3-dev, gawk, chrpath, libsnmp-dev, git, dh-autoreconf, libjson-c-dev, libjson-c2 | libjson-c3, dh-systemd, libsystemd-dev, bison, flex, libc-ares-dev, pkg-config, python (>= 2.7), python-ipaddr, python-sphinx, libpython-dev
+Build-Depends: debhelper (>= 7.0.50~), libncurses5-dev, libreadline-dev, texlive-latex-base, texlive-generic-recommended, libpam0g-dev | libpam-dev, libcap-dev, texinfo (>= 4.7), imagemagick, ghostscript, groff, autotools-dev, libpcre3-dev, gawk, chrpath, libsnmp-dev, git, dh-autoreconf, libjson-c-dev, libjson-c2 | libjson-c3, dh-systemd, libsystemd-dev, bison, flex, libc-ares-dev, pkg-config, python (>= 2.7), python-ipaddress, python-sphinx, libpython-dev
Standards-Version: 3.9.6
Homepage: http://www.frrouting.org/
@@ -47,7 +47,7 @@ Description: BGP/OSPF/RIP/RIPng/ISIS/PIM/LDP routing daemon (documentation)
Package: frr-pythontools
Section: net
Architecture: all
-Depends: ${misc:Depends}, frr (= ${binary:Version}), python (>= 2.7), python-ipaddr
+Depends: ${misc:Depends}, frr (= ${binary:Version}), python (>= 2.7), python-ipaddress
Description: BGP/OSPF/RIP/RIPng/ISIS/PIM/LDP routing daemon (Python Tools)
This package includes info files for frr, a free software which manages
TCP/IP based routing protocols. It supports BGP4, BGP4+, OSPFv2, OSPFv3,
diff --git a/doc/developer/building-frr-for-ubuntu1604.rst b/doc/developer/building-frr-for-ubuntu1604.rst
index 69c4e44d98..1fa0ede201 100644
--- a/doc/developer/building-frr-for-ubuntu1604.rst
+++ b/doc/developer/building-frr-for-ubuntu1604.rst
@@ -16,8 +16,8 @@ Add packages:
apt-get install \
git autoconf automake libtool make gawk libreadline-dev texinfo dejagnu \
pkg-config libpam0g-dev libjson-c-dev bison flex python-pytest \
- libc-ares-dev python3-dev libsystemd-dev python-ipaddr python3-sphinx \
- install-info
+ libc-ares-dev python3-dev libsystemd-dev python-ipaddress \
+ python3-sphinx install-info
Get FRR, compile it and install it (from Git)
---------------------------------------------
diff --git a/doc/developer/building-frr-for-ubuntu1804.rst b/doc/developer/building-frr-for-ubuntu1804.rst
index 50e90fc7ea..75b31a41f9 100644
--- a/doc/developer/building-frr-for-ubuntu1804.rst
+++ b/doc/developer/building-frr-for-ubuntu1804.rst
@@ -12,8 +12,8 @@ Required packages
sudo apt-get install \
git autoconf automake libtool make gawk libreadline-dev texinfo \
pkg-config libpam0g-dev libjson-c-dev bison flex python-pytest \
- libc-ares-dev python3-dev libsystemd-dev python-ipaddr python3-sphinx \
- install-info
+ libc-ares-dev python3-dev libsystemd-dev python-ipaddress \
+ python3-sphinx install-info
Optional packages
^^^^^^^^^^^^^^^^^
diff --git a/doc/subdir.am b/doc/subdir.am
index 4170101655..7d3792bf2b 100644
--- a/doc/subdir.am
+++ b/doc/subdir.am
@@ -56,7 +56,7 @@ doc/%/_build/man/man.stamp: doc/%/_build/.doctrees/environment.pickle
$(MKDIR_P) "$${subdoc}/_build/man"; touch $@.tmp; \
$(SPHINXBUILD) -a -q -b man -d "$${subdoc}/_build/.doctrees" \
$(ALLSPHINXOPTS) "$(top_srcdir)/$${subdoc}" "$${subdoc}/_build/man" && \
- mv $@.tmp $@ \
+ mv -f $@.tmp $@ \
)
#
diff --git a/eigrpd/eigrp_dump.c b/eigrpd/eigrp_dump.c
index 651a9339d7..bbe2b88223 100644
--- a/eigrpd/eigrp_dump.c
+++ b/eigrpd/eigrp_dump.c
@@ -300,7 +300,7 @@ void show_ip_eigrp_prefix_entry(struct vty *vty, struct eigrp_prefix_entry *tn)
tn->serno);
if (successors)
- list_delete_and_null(&successors);
+ list_delete(&successors);
}
void show_ip_eigrp_nexthop_entry(struct vty *vty, struct eigrp *eigrp,
diff --git a/eigrpd/eigrp_fsm.c b/eigrpd/eigrp_fsm.c
index d291cab4c0..f955e6df0f 100644
--- a/eigrpd/eigrp_fsm.c
+++ b/eigrpd/eigrp_fsm.c
@@ -453,7 +453,7 @@ int eigrp_fsm_event_nq_fcn(struct eigrp_fsm_action_message *msg)
// neighbors left
}
- list_delete_and_null(&successors);
+ list_delete(&successors);
return 1;
}
@@ -479,7 +479,7 @@ int eigrp_fsm_event_q_fcn(struct eigrp_fsm_action_message *msg)
// neighbors left
}
- list_delete_and_null(&successors);
+ list_delete(&successors);
return 1;
}
@@ -530,7 +530,7 @@ int eigrp_fsm_event_lr(struct eigrp_fsm_action_message *msg)
ne = listnode_head(successors);
eigrp_send_reply(ne->adv_router, prefix);
- list_delete_and_null(&successors);
+ list_delete(&successors);
}
prefix->state = EIGRP_FSM_STATE_PASSIVE;
@@ -560,7 +560,7 @@ int eigrp_fsm_event_dinc(struct eigrp_fsm_action_message *msg)
msg);
- list_delete_and_null(&successors);
+ list_delete(&successors);
return 1;
}
@@ -584,7 +584,7 @@ int eigrp_fsm_event_lr_fcs(struct eigrp_fsm_action_message *msg)
ne = listnode_head(successors);
eigrp_send_reply(ne->adv_router, prefix);
- list_delete_and_null(&successors);
+ list_delete(&successors);
}
prefix->req_action |= EIGRP_FSM_NEED_UPDATE;
listnode_add(eigrp->topology_changes_internalIPV4, prefix);
@@ -620,7 +620,7 @@ int eigrp_fsm_event_lr_fcn(struct eigrp_fsm_action_message *msg)
// neighbors left
}
- list_delete_and_null(&successors);
+ list_delete(&successors);
return 1;
}
@@ -636,6 +636,6 @@ int eigrp_fsm_event_qact(struct eigrp_fsm_action_message *msg)
msg->prefix->state = EIGRP_FSM_STATE_ACTIVE_2;
msg->prefix->distance = ne->distance;
- list_delete_and_null(&successors);
+ list_delete(&successors);
return 1;
}
diff --git a/eigrpd/eigrp_interface.c b/eigrpd/eigrp_interface.c
index 913db684c1..e450c7d999 100644
--- a/eigrpd/eigrp_interface.c
+++ b/eigrpd/eigrp_interface.c
@@ -109,7 +109,7 @@ int eigrp_if_delete_hook(struct interface *ifp)
if (!ei)
return 0;
- list_delete_and_null(&ei->nbrs);
+ list_delete(&ei->nbrs);
eigrp = ei->eigrp;
listnode_delete(eigrp->eiflist, ei);
@@ -351,7 +351,7 @@ void eigrp_if_free(struct eigrp_interface *ei, int source)
eigrp_if_down(ei);
- list_delete_and_null(&ei->nbrs);
+ list_delete(&ei->nbrs);
listnode_delete(ei->eigrp->eiflist, ei);
}
diff --git a/eigrpd/eigrp_query.c b/eigrpd/eigrp_query.c
index dd4231fa00..84dcf5e2d5 100644
--- a/eigrpd/eigrp_query.c
+++ b/eigrpd/eigrp_query.c
@@ -235,11 +235,8 @@ void eigrp_send_query(struct eigrp_interface *ei)
}
}
- if (!has_tlv) {
- if (ep)
- eigrp_packet_free(ep);
+ if (!has_tlv)
return;
- }
if ((ei->params.auth_type == EIGRP_AUTH_TYPE_MD5)
&& ei->params.auth_keychain != NULL)
diff --git a/eigrpd/eigrp_topology.c b/eigrpd/eigrp_topology.c
index 3520972731..0cb4e0e9f4 100644
--- a/eigrpd/eigrp_topology.c
+++ b/eigrpd/eigrp_topology.c
@@ -164,7 +164,7 @@ void eigrp_nexthop_entry_add(struct eigrp_prefix_entry *node,
eigrp_zebra_route_add(node->destination, l);
}
- list_delete_and_null(&l);
+ list_delete(&l);
}
/*
@@ -193,8 +193,8 @@ void eigrp_prefix_entry_delete(struct route_table *table,
for (ALL_LIST_ELEMENTS(pe->entries, node, nnode, ne))
eigrp_nexthop_entry_delete(pe, ne);
- list_delete_and_null(&pe->entries);
- list_delete_and_null(&pe->rij);
+ list_delete(&pe->entries);
+ list_delete(&pe->rij);
eigrp_zebra_route_delete(pe->destination);
prefix_free(pe->destination);
@@ -276,7 +276,7 @@ struct list *eigrp_topology_get_successor(struct eigrp_prefix_entry *table_node)
* If we have no successors return NULL
*/
if (!successors->count) {
- list_delete_and_null(&successors);
+ list_delete(&successors);
successors = NULL;
}
@@ -481,7 +481,7 @@ void eigrp_update_routing_table(struct eigrp_prefix_entry *prefix)
for (ALL_LIST_ELEMENTS_RO(successors, node, entry))
entry->flags |= EIGRP_NEXTHOP_ENTRY_INTABLE_FLAG;
- list_delete_and_null(&successors);
+ list_delete(&successors);
} else {
eigrp_zebra_route_delete(prefix->destination);
for (ALL_LIST_ELEMENTS_RO(prefix->entries, node, entry))
diff --git a/eigrpd/eigrp_update.c b/eigrpd/eigrp_update.c
index e0142f6b32..8db4903077 100644
--- a/eigrpd/eigrp_update.c
+++ b/eigrpd/eigrp_update.c
@@ -411,7 +411,7 @@ void eigrp_update_receive(struct eigrp *eigrp, struct ip *iph,
eigrp_update_send_all(eigrp, ei);
if (nbr_prefixes)
- list_delete_and_null(&nbr_prefixes);
+ list_delete(&nbr_prefixes);
}
/*send EIGRP Update packet*/
diff --git a/eigrpd/eigrpd.c b/eigrpd/eigrpd.c
index e9f81fc1c5..9bbecdf9e3 100644
--- a/eigrpd/eigrpd.c
+++ b/eigrpd/eigrpd.c
@@ -266,15 +266,15 @@ void eigrp_finish_final(struct eigrp *eigrp)
THREAD_OFF(eigrp->t_read);
close(eigrp->fd);
- list_delete_and_null(&eigrp->eiflist);
- list_delete_and_null(&eigrp->oi_write_q);
+ list_delete(&eigrp->eiflist);
+ list_delete(&eigrp->oi_write_q);
eigrp_topology_free(eigrp->topology_table);
eigrp_nbr_delete(eigrp->neighbor_self);
- list_delete_and_null(&eigrp->topology_changes_externalIPV4);
- list_delete_and_null(&eigrp->topology_changes_internalIPV4);
+ list_delete(&eigrp->topology_changes_externalIPV4);
+ list_delete(&eigrp->topology_changes_internalIPV4);
listnode_delete(eigrp_om->eigrp, eigrp);
diff --git a/isisd/isis_circuit.c b/isisd/isis_circuit.c
index b43a3915ae..58c6dfa368 100644
--- a/isisd/isis_circuit.c
+++ b/isisd/isis_circuit.c
@@ -449,17 +449,17 @@ void isis_circuit_if_del(struct isis_circuit *circuit, struct interface *ifp)
if (circuit->ip_addrs) {
assert(listcount(circuit->ip_addrs) == 0);
- list_delete_and_null(&circuit->ip_addrs);
+ list_delete(&circuit->ip_addrs);
}
if (circuit->ipv6_link) {
assert(listcount(circuit->ipv6_link) == 0);
- list_delete_and_null(&circuit->ipv6_link);
+ list_delete(&circuit->ipv6_link);
}
if (circuit->ipv6_non_link) {
assert(listcount(circuit->ipv6_non_link) == 0);
- list_delete_and_null(&circuit->ipv6_non_link);
+ list_delete(&circuit->ipv6_non_link);
}
circuit->circ_type = CIRCUIT_T_UNKNOWN;
@@ -685,22 +685,22 @@ void isis_circuit_down(struct isis_circuit *circuit)
if (circuit->circ_type == CIRCUIT_T_BROADCAST) {
/* destroy neighbour lists */
if (circuit->u.bc.lan_neighs[0]) {
- list_delete_and_null(&circuit->u.bc.lan_neighs[0]);
+ list_delete(&circuit->u.bc.lan_neighs[0]);
circuit->u.bc.lan_neighs[0] = NULL;
}
if (circuit->u.bc.lan_neighs[1]) {
- list_delete_and_null(&circuit->u.bc.lan_neighs[1]);
+ list_delete(&circuit->u.bc.lan_neighs[1]);
circuit->u.bc.lan_neighs[1] = NULL;
}
/* destroy adjacency databases */
if (circuit->u.bc.adjdb[0]) {
circuit->u.bc.adjdb[0]->del = isis_delete_adj;
- list_delete_and_null(&circuit->u.bc.adjdb[0]);
+ list_delete(&circuit->u.bc.adjdb[0]);
circuit->u.bc.adjdb[0] = NULL;
}
if (circuit->u.bc.adjdb[1]) {
circuit->u.bc.adjdb[1]->del = isis_delete_adj;
- list_delete_and_null(&circuit->u.bc.adjdb[1]);
+ list_delete(&circuit->u.bc.adjdb[1]);
circuit->u.bc.adjdb[1] = NULL;
}
if (circuit->u.bc.is_dr[0]) {
diff --git a/isisd/isis_dr.c b/isisd/isis_dr.c
index 99506a243d..f71fe9555b 100644
--- a/isisd/isis_dr.c
+++ b/isisd/isis_dr.c
@@ -135,7 +135,7 @@ int isis_dr_elect(struct isis_circuit *circuit, int level)
if (!adjdb) {
zlog_warn("isis_dr_elect() adjdb == NULL");
- list_delete_and_null(&list);
+ list_delete(&list);
return ISIS_WARNING;
}
isis_adj_build_up_list(adjdb, list);
@@ -177,7 +177,7 @@ int isis_dr_elect(struct isis_circuit *circuit, int level)
*/
if (circuit->u.bc.is_dr[level - 1])
retval = isis_dr_resign(circuit, level);
- list_delete_and_null(&list);
+ list_delete(&list);
return retval;
}
@@ -217,7 +217,7 @@ int isis_dr_elect(struct isis_circuit *circuit, int level)
if (circuit->u.bc.is_dr[level - 1])
retval = isis_dr_resign(circuit, level);
}
- list_delete_and_null(&list);
+ list_delete(&list);
return retval;
}
diff --git a/isisd/isis_events.c b/isisd/isis_events.c
index 342787af30..5dcc0a1324 100644
--- a/isisd/isis_events.c
+++ b/isisd/isis_events.c
@@ -134,7 +134,7 @@ static void circuit_resign_level(struct isis_circuit *circuit, int level)
circuit->lsp_regenerate_pending[idx] = 0;
circuit->u.bc.run_dr_elect[idx] = 0;
if (circuit->u.bc.lan_neighs[idx] != NULL)
- list_delete_and_null(&circuit->u.bc.lan_neighs[idx]);
+ list_delete(&circuit->u.bc.lan_neighs[idx]);
}
return;
diff --git a/isisd/isis_lsp.c b/isisd/isis_lsp.c
index b2c6f092ee..5418e31890 100644
--- a/isisd/isis_lsp.c
+++ b/isisd/isis_lsp.c
@@ -126,7 +126,7 @@ static void lsp_destroy(struct isis_lsp *lsp)
lsp_clear_data(lsp);
if (LSP_FRAGMENT(lsp->hdr.lsp_id) == 0 && lsp->lspu.frags) {
- list_delete_and_null(&lsp->lspu.frags);
+ list_delete(&lsp->lspu.frags);
lsp->lspu.frags = NULL;
}
@@ -1181,7 +1181,7 @@ static void lsp_build(struct isis_lsp *lsp, struct isis_area *area)
frag->tlvs = tlvs;
}
- list_delete_and_null(&fragments);
+ list_delete(&fragments);
lsp_debug("ISIS (%s): LSP construction is complete. Serializing...",
area->area_tag);
return;
@@ -1560,7 +1560,7 @@ static void lsp_build_pseudo(struct isis_lsp *lsp, struct isis_circuit *circuit,
LSP_PSEUDO_ID(ne_id));
}
}
- list_delete_and_null(&adj_list);
+ list_delete(&adj_list);
return;
}
diff --git a/isisd/isis_mt.c b/isisd/isis_mt.c
index 2dfccf9830..e0227f4656 100644
--- a/isisd/isis_mt.c
+++ b/isisd/isis_mt.c
@@ -163,7 +163,7 @@ void area_mt_init(struct isis_area *area)
void area_mt_finish(struct isis_area *area)
{
- list_delete_and_null(&area->mt_settings);
+ list_delete(&area->mt_settings);
}
struct isis_area_mt_setting *area_get_mt_setting(struct isis_area *area,
@@ -286,7 +286,7 @@ void circuit_mt_init(struct isis_circuit *circuit)
void circuit_mt_finish(struct isis_circuit *circuit)
{
- list_delete_and_null(&circuit->mt_settings);
+ list_delete(&circuit->mt_settings);
}
struct isis_circuit_mt_setting *
diff --git a/isisd/isis_pdu.c b/isisd/isis_pdu.c
index 7843fb9b9d..99041b0e61 100644
--- a/isisd/isis_pdu.c
+++ b/isisd/isis_pdu.c
@@ -1356,7 +1356,7 @@ static int process_snp(uint8_t pdu_type, struct isis_circuit *circuit,
}
/* lets free it */
- list_delete_and_null(&lsp_list);
+ list_delete(&lsp_list);
}
if (fabricd_initial_sync_is_complete(circuit->area) && resync_needed)
diff --git a/isisd/isis_route.c b/isisd/isis_route.c
index b1225ae547..f9b4a2b146 100644
--- a/isisd/isis_route.c
+++ b/isisd/isis_route.c
@@ -253,13 +253,13 @@ static void isis_route_info_delete(struct isis_route_info *route_info)
if (route_info->nexthops) {
route_info->nexthops->del =
(void (*)(void *))isis_nexthop_delete;
- list_delete_and_null(&route_info->nexthops);
+ list_delete(&route_info->nexthops);
}
if (route_info->nexthops6) {
route_info->nexthops6->del =
(void (*)(void *))isis_nexthop6_delete;
- list_delete_and_null(&route_info->nexthops6);
+ list_delete(&route_info->nexthops6);
}
XFREE(MTYPE_ISIS_ROUTE_INFO, route_info);
diff --git a/isisd/isis_spf.c b/isisd/isis_spf.c
index 42a019890f..1440a3becf 100644
--- a/isisd/isis_spf.c
+++ b/isisd/isis_spf.c
@@ -824,7 +824,7 @@ static int isis_spf_preload_tent(struct isis_spftree *spftree,
adjdb = circuit->u.bc.adjdb[spftree->level - 1];
isis_adj_build_up_list(adjdb, adj_list);
if (listcount(adj_list) == 0) {
- list_delete_and_null(&adj_list);
+ list_delete(&adj_list);
if (isis->debugs & DEBUG_SPF_EVENTS)
zlog_debug(
"ISIS-Spf: no L%d adjacencies on circuit %s",
@@ -890,7 +890,7 @@ static int isis_spf_preload_tent(struct isis_spftree *spftree,
"isis_spf_preload_tent unknow adj type");
}
}
- list_delete_and_null(&adj_list);
+ list_delete(&adj_list);
/*
* Add the pseudonode
*/
diff --git a/isisd/isis_spf_private.h b/isisd/isis_spf_private.h
index 453abfedd8..131fa37991 100644
--- a/isisd/isis_spf_private.h
+++ b/isisd/isis_spf_private.h
@@ -168,8 +168,8 @@ static void isis_vertex_queue_init(struct isis_vertex_queue *queue,
__attribute__((__unused__))
static void isis_vertex_del(struct isis_vertex *vertex)
{
- list_delete_and_null(&vertex->Adj_N);
- list_delete_and_null(&vertex->parents);
+ list_delete(&vertex->Adj_N);
+ list_delete(&vertex->parents);
if (vertex->firsthops) {
hash_clean(vertex->firsthops, NULL);
hash_free(vertex->firsthops);
@@ -212,7 +212,7 @@ static void isis_vertex_queue_free(struct isis_vertex_queue *queue)
skiplist_free(queue->l.slist);
queue->l.slist = NULL;
} else
- list_delete_and_null(&queue->l.list);
+ list_delete(&queue->l.list);
}
__attribute__((__unused__))
diff --git a/isisd/isis_tlvs.c b/isisd/isis_tlvs.c
index 782462766a..fce3a0a113 100644
--- a/isisd/isis_tlvs.c
+++ b/isisd/isis_tlvs.c
@@ -2946,7 +2946,7 @@ struct list *isis_fragment_tlvs(struct isis_tlvs *tlvs, size_t size)
struct listnode *node;
for (ALL_LIST_ELEMENTS_RO(rv, node, fragment_tlvs))
isis_free_tlvs(fragment_tlvs);
- list_delete_and_null(&rv);
+ list_delete(&rv);
}
stream_free(dummy_stream);
diff --git a/isisd/isisd.c b/isisd/isisd.c
index e3ff3b8d93..e5e43c4b7d 100644
--- a/isisd/isisd.c
+++ b/isisd/isisd.c
@@ -226,7 +226,7 @@ int isis_area_destroy(struct vty *vty, const char *area_tag)
circuit->ipv6_router = 0;
isis_csm_state_change(ISIS_DISABLE, circuit, area);
}
- list_delete_and_null(&area->circuit_list);
+ list_delete(&area->circuit_list);
}
if (area->lspdb[0] != NULL) {
diff --git a/lib/command.c b/lib/command.c
index e4e3d786ac..60c5f4e75b 100644
--- a/lib/command.c
+++ b/lib/command.c
@@ -695,7 +695,7 @@ static vector cmd_complete_command_real(vector vline, struct vty *vty,
}
vector comps = completions_to_vec(completions);
- list_delete_and_null(&completions);
+ list_delete(&completions);
// set status code appropriately
switch (vector_active(comps)) {
@@ -1020,7 +1020,7 @@ static int cmd_execute_command_real(vector vline, enum filter_type filter,
// if matcher error, return corresponding CMD_ERR
if (MATCHER_ERROR(status)) {
if (argv_list)
- list_delete_and_null(&argv_list);
+ list_delete(&argv_list);
switch (status) {
case MATCHER_INCOMPLETE:
return CMD_ERR_INCOMPLETE;
@@ -1049,7 +1049,7 @@ static int cmd_execute_command_real(vector vline, enum filter_type filter,
ret = matched_element->func(matched_element, vty, argc, argv);
// delete list and cmd_token's in it
- list_delete_and_null(&argv_list);
+ list_delete(&argv_list);
XFREE(MTYPE_TMP, argv);
return ret;
@@ -2949,6 +2949,6 @@ void cmd_terminate()
if (host.config)
XFREE(MTYPE_HOST, host.config);
- list_delete_and_null(&varhandlers);
+ list_delete(&varhandlers);
qobj_finish();
}
diff --git a/lib/command_match.c b/lib/command_match.c
index a1ae3ac6b9..8b34d1e3eb 100644
--- a/lib/command_match.c
+++ b/lib/command_match.c
@@ -334,7 +334,7 @@ static enum matcher_rv command_match_r(struct graph_node *start, vector vline,
status = MATCHER_INCOMPLETE;
// cleanup
- list_delete_and_null(&next);
+ list_delete(&next);
return status;
}
@@ -367,7 +367,7 @@ enum matcher_rv command_complete(struct graph *graph, vector vline,
unsigned int idx;
for (idx = 0; idx < vector_active(vline) && next->count > 0; idx++) {
- list_delete_and_null(&current);
+ list_delete(&current);
current = next;
next = list_new();
next->del = stack_del;
@@ -458,8 +458,8 @@ enum matcher_rv command_complete(struct graph *graph, vector vline,
}
}
- list_delete_and_null(&current);
- list_delete_and_null(&next);
+ list_delete(&current);
+ list_delete(&next);
return mrv;
}
@@ -652,7 +652,7 @@ static void del_arglist(struct list *list)
list_delete_node(list, tail);
// delete the rest of the list as usual
- list_delete_and_null(&list);
+ list_delete(&list);
}
/*---------- token level matching functions ----------*/
diff --git a/lib/ferr.c b/lib/ferr.c
index afef196cec..bf89cc7f46 100644
--- a/lib/ferr.c
+++ b/lib/ferr.c
@@ -167,7 +167,7 @@ void log_ref_display(struct vty *vty, uint32_t code, bool json)
json_object_free(top);
}
- list_delete_and_null(&errlist);
+ list_delete(&errlist);
}
DEFUN_NOSH(show_error_code,
diff --git a/lib/frr_pthread.c b/lib/frr_pthread.c
index c1ce57e24e..a0223730b8 100644
--- a/lib/frr_pthread.c
+++ b/lib/frr_pthread.c
@@ -61,7 +61,7 @@ void frr_pthread_finish()
{
pthread_mutex_lock(&frr_pthread_list_mtx);
{
- list_delete_and_null(&frr_pthread_list);
+ list_delete(&frr_pthread_list);
}
pthread_mutex_unlock(&frr_pthread_list_mtx);
}
diff --git a/lib/grammar_sandbox.c b/lib/grammar_sandbox.c
index 0d6200b006..20d5879c67 100644
--- a/lib/grammar_sandbox.c
+++ b/lib/grammar_sandbox.c
@@ -140,7 +140,7 @@ DEFUN (grammar_test_complete,
vty_out(vty, "%% No match\n");
// free resources
- list_delete_and_null(&completions);
+ list_delete(&completions);
cmd_free_strvec(command);
XFREE(MTYPE_TMP, cmdstr);
@@ -184,7 +184,7 @@ DEFUN (grammar_test_match,
vty_out(vty, "func: %p\n", element->func);
- list_delete_and_null(&argvv);
+ list_delete(&argvv);
} else {
assert(MATCHER_ERROR(result));
switch (result) {
@@ -421,7 +421,7 @@ DEFUN (grammar_findambig,
}
prev = cur;
}
- list_delete_and_null(&commands);
+ list_delete(&commands);
vty_out(vty, "\n");
} while (scan && scannode < LINK_PARAMS_NODE);
diff --git a/lib/hash.c b/lib/hash.c
index ee5401b236..114522a75a 100644
--- a/lib/hash.c
+++ b/lib/hash.c
@@ -318,7 +318,7 @@ void hash_free(struct hash *hash)
if (_hashes) {
listnode_delete(_hashes, hash);
if (_hashes->count == 0) {
- list_delete_and_null(&_hashes);
+ list_delete(&_hashes);
}
}
}
diff --git a/lib/if.c b/lib/if.c
index 67e2d366cd..e952313e8e 100644
--- a/lib/if.c
+++ b/lib/if.c
@@ -206,8 +206,8 @@ void if_delete(struct interface *ifp)
if_delete_retain(ifp);
- list_delete_and_null(&ifp->connected);
- list_delete_and_null(&ifp->nbr_connected);
+ list_delete(&ifp->connected);
+ list_delete(&ifp->nbr_connected);
if_link_params_free(ifp);
diff --git a/lib/keychain.c b/lib/keychain.c
index 494f6f6430..601b44a4f1 100644
--- a/lib/keychain.c
+++ b/lib/keychain.c
@@ -119,7 +119,7 @@ static void keychain_delete(struct keychain *keychain)
if (keychain->name)
XFREE(MTYPE_KEYCHAIN, keychain->name);
- list_delete_and_null(&keychain->key);
+ list_delete(&keychain->key);
listnode_delete(keychain_list, keychain);
keychain_free(keychain);
}
diff --git a/lib/libfrr.c b/lib/libfrr.c
index 2bce4766d3..94cd0ab623 100644
--- a/lib/libfrr.c
+++ b/lib/libfrr.c
@@ -973,3 +973,25 @@ void frr_fini(void)
fclose(fp);
}
}
+
+#ifdef INTERP
+static const char interp[]
+ __attribute__((section(".interp"), used)) = INTERP;
+#endif
+/*
+ * executable entry point for libfrr.so
+ *
+ * note that libc initialization is skipped for this so the set of functions
+ * that can be called is rather limited
+ */
+extern void _libfrr_version(void)
+ __attribute__((visibility("hidden"), noreturn));
+void _libfrr_version(void)
+{
+ const char banner[] =
+ FRR_FULL_NAME " " FRR_VERSION ".\n"
+ FRR_COPYRIGHT GIT_INFO "\n"
+ "configured with:\n " FRR_CONFIG_ARGS "\n";
+ write(1, banner, sizeof(banner) - 1);
+ _exit(0);
+}
diff --git a/lib/linklist.c b/lib/linklist.c
index bee9d05a2c..3aa7cae8b7 100644
--- a/lib/linklist.c
+++ b/lib/linklist.c
@@ -240,7 +240,7 @@ void list_delete_all_node(struct list *list)
list->count = 0;
}
-void list_delete_and_null(struct list **list)
+void list_delete(struct list **list)
{
assert(*list);
list_delete_all_node(*list);
@@ -248,11 +248,6 @@ void list_delete_and_null(struct list **list)
*list = NULL;
}
-void list_delete_original(struct list *list)
-{
- list_delete_and_null(&list);
-}
-
struct listnode *listnode_lookup(struct list *list, void *data)
{
struct listnode *node;
diff --git a/lib/linklist.h b/lib/linklist.h
index f5cd44efb0..0475391e9f 100644
--- a/lib/linklist.h
+++ b/lib/linklist.h
@@ -236,20 +236,6 @@ extern void list_sort(struct list *list,
int (*cmp)(const void **, const void **));
/*
- * The usage of list_delete is being transitioned to pass in
- * the double pointer to remove use after free's.
- * list_free usage is deprecated, it leads to memory leaks
- * of the linklist nodes. Please use list_delete_and_null
- *
- * In Oct of 2018, rename list_delete_and_null to list_delete
- * and remove list_delete_original and the list_delete #define
- * Additionally remove list_free entirely
- */
-#if CONFDATE > 20181001
-CPP_NOTICE("list_delete without double pointer is deprecated, please fixup")
-#endif
-
-/*
* Delete a list and NULL its pointer.
*
* If non-null, list->del is called with each data element.
@@ -258,23 +244,7 @@ CPP_NOTICE("list_delete without double pointer is deprecated, please fixup")
* pointer to list pointer; this will be set to NULL after the list has been
* deleted
*/
-extern void list_delete_and_null(struct list **plist);
-
-/*
- * Delete a list.
- *
- * If non-null, list->del is called with each data element.
- *
- * plist
- * pointer to list pointer
- */
-extern void list_delete_original(struct list *list);
-#define list_delete(X) \
- list_delete_original((X)) \
- CPP_WARN("Please transition to using list_delete_and_null")
-#define list_free(X) \
- list_delete_original((X)) \
- CPP_WARN("Please transition tousing list_delete_and_null")
+extern void list_delete(struct list **plist);
/*
* Delete all nodes from a list without deleting the list itself.
diff --git a/lib/lua.c b/lib/lua.c
new file mode 100644
index 0000000000..3d701a9364
--- /dev/null
+++ b/lib/lua.c
@@ -0,0 +1,130 @@
+/*
+ * This file defines the lua interface into
+ * FRRouting.
+ *
+ * Copyright (C) 2016 Cumulus Networks, Inc.
+ * Donald Sharp
+ *
+ * This file is part of FreeRangeRouting (FRR).
+ *
+ * FRR 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, or (at your option) any later version.
+ *
+ * FRR 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 FRR; see the file COPYING. If not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+#include <stdio.h>
+
+#include <zebra.h>
+
+#if defined(HAVE_LUA)
+#include "prefix.h"
+#include "lua.h"
+#include "log.h"
+
+static int lua_zlog_debug(lua_State *L)
+{
+ int debug_lua = 1;
+ const char *string = lua_tostring(L, 1);
+
+ if (debug_lua)
+ zlog_debug("%s", string);
+
+ return 0;
+}
+
+const char *get_string(lua_State *L, const char *key)
+{
+ const char *str;
+
+ lua_pushstring(L, key);
+ lua_gettable(L, -2);
+
+ str = (const char *)lua_tostring(L, -1);
+ lua_pop(L, 1);
+
+ return str;
+}
+
+int get_integer(lua_State *L, const char *key)
+{
+ int result;
+
+ lua_pushstring(L, key);
+ lua_gettable(L, -2);
+
+ result = lua_tointeger(L, -1);
+ lua_pop(L, 1);
+
+ return result;
+}
+
+static void *lua_alloc(void *ud, void *ptr, size_t osize,
+ size_t nsize)
+{
+ (void)ud; (void)osize; /* not used */
+ if (nsize == 0) {
+ free(ptr);
+ return NULL;
+ } else
+ return realloc(ptr, nsize);
+}
+
+lua_State *lua_initialize(const char *file)
+{
+ int status;
+ lua_State *L = lua_newstate(lua_alloc, NULL);
+
+ zlog_debug("Newstate: %p", L);
+ luaL_openlibs(L);
+ zlog_debug("Opened lib");
+ status = luaL_loadfile(L, file);
+ if (status) {
+ zlog_debug("Failure to open %s %d", file, status);
+ lua_close(L);
+ return NULL;
+ }
+
+ lua_pcall(L, 0, LUA_MULTRET, 0);
+ zlog_debug("Setting global function");
+ lua_pushcfunction(L, lua_zlog_debug);
+ lua_setglobal(L, "zlog_debug");
+
+ return L;
+}
+
+void lua_setup_prefix_table(lua_State *L, const struct prefix *prefix)
+{
+ char buffer[100];
+
+ lua_newtable(L);
+ lua_pushstring(L, prefix2str(prefix, buffer, 100));
+ lua_setfield(L, -2, "route");
+ lua_pushinteger(L, prefix->family);
+ lua_setfield(L, -2, "family");
+ lua_setglobal(L, "prefix");
+}
+
+enum lua_rm_status lua_run_rm_rule(lua_State *L, const char *rule)
+{
+ int status;
+
+ lua_getglobal(L, rule);
+ status = lua_pcall(L, 0, 1, 0);
+ if (status) {
+ zlog_debug("Executing Failure with function: %s: %d",
+ rule, status);
+ return LUA_RM_FAILURE;
+ }
+
+ status = lua_tonumber(L, -1);
+ return status;
+}
+#endif
diff --git a/lib/lua.h b/lib/lua.h
new file mode 100644
index 0000000000..8020a22711
--- /dev/null
+++ b/lib/lua.h
@@ -0,0 +1,79 @@
+/*
+ * This file defines the lua interface into
+ * FRRouting.
+ *
+ * Copyright (C) 2016 Cumulus Networks, Inc.
+ * Donald Sharp
+ *
+ * This file is part of FreeRangeRouting (FRR).
+ *
+ * FRR 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, or (at your option) any later version.
+ *
+ * FRR 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 FRR; see the file COPYING. If not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+#ifndef __LUA_H__
+#define __LUA_H__
+
+#if defined(HAVE_LUA)
+
+#include <lua.h>
+#include <lualib.h>
+#include <lauxlib.h>
+
+/*
+ * These functions are helper functions that
+ * try to glom some of the lua_XXX functionality
+ * into what we actually need, instead of having
+ * to make multiple calls to set up what
+ * we want
+ */
+enum lua_rm_status {
+ /*
+ * Script function run failure. This will translate into a
+ * deny
+ */
+ LUA_RM_FAILURE = 0,
+ /*
+ * No Match was found for the route map function
+ */
+ LUA_RM_NOMATCH,
+ /*
+ * Match was found but no changes were made to the
+ * incoming data.
+ */
+ LUA_RM_MATCH,
+ /*
+ * Match was found and data was modified, so
+ * figure out what changed
+ */
+ LUA_RM_MATCH_AND_CHANGE,
+};
+
+/*
+ * Open up the lua.scr file and parse
+ * initial global values, if any.
+ */
+lua_State *lua_initialize(const char *file);
+
+void lua_setup_prefix_table(lua_State *L, const struct prefix *prefix);
+
+enum lua_rm_status lua_run_rm_rule(lua_State *L, const char *rule);
+
+/*
+ * Get particular string/integer information
+ * from a table. It is *assumed* that
+ * the table has already been selected
+ */
+const char *get_string(lua_State *L, const char *key);
+int get_integer(lua_State *L, const char *key);
+#endif
+#endif
diff --git a/lib/nexthop_group.c b/lib/nexthop_group.c
index 937b84bddd..23ea96f75c 100644
--- a/lib/nexthop_group.c
+++ b/lib/nexthop_group.c
@@ -246,7 +246,7 @@ static void nhgc_delete(struct nexthop_group_cmd *nhgc)
RB_REMOVE(nhgc_entry_head, &nhgc_entries, nhgc);
- list_delete_and_null(&nhgc->nhg_list);
+ list_delete(&nhgc->nhg_list);
XFREE(MTYPE_TMP, nhgc);
}
diff --git a/lib/openbsd-tree.c b/lib/openbsd-tree.c
index e8d13339b6..eadef9902b 100644
--- a/lib/openbsd-tree.c
+++ b/lib/openbsd-tree.c
@@ -345,7 +345,7 @@ rbe_remove(const struct rb_type *t, struct rbt_tree *rbt, struct rb_entry *rbe)
else
RBE_RIGHT(tmp) = rbe;
- rbe_if_augment(t, parent);
+ rbe_if_augment(t, tmp);
} else
RBH_ROOT(rbt) = rbe;
diff --git a/lib/routemap.c b/lib/routemap.c
index 028351f6c6..bc45cd51d0 100644
--- a/lib/routemap.c
+++ b/lib/routemap.c
@@ -111,6 +111,20 @@ struct route_map_match_set_hooks {
const char *arg,
route_map_event_t type);
+ /* match ip next hop type */
+ int (*match_ip_next_hop_type)(struct vty *vty,
+ struct route_map_index *index,
+ const char *command,
+ const char *arg,
+ route_map_event_t type);
+
+ /* no match ip next hop type */
+ int (*no_match_ip_next_hop_type)(struct vty *vty,
+ struct route_map_index *index,
+ const char *command,
+ const char *arg,
+ route_map_event_t type);
+
/* match ipv6 address */
int (*match_ipv6_address)(struct vty *vty,
struct route_map_index *index,
@@ -138,6 +152,19 @@ struct route_map_match_set_hooks {
const char *arg,
route_map_event_t type);
+ /* match ipv6 next-hop type */
+ int (*match_ipv6_next_hop_type)(struct vty *vty,
+ struct route_map_index *index,
+ const char *command,
+ const char *arg,
+ route_map_event_t type);
+
+ /* no match ipv6next-hop type */
+ int (*no_match_ipv6_next_hop_type)(struct vty *vty,
+ struct route_map_index *index,
+ const char *command, const char *arg,
+ route_map_event_t type);
+
/* match metric */
int (*match_metric)(struct vty *vty, struct route_map_index *index,
const char *command, const char *arg,
@@ -275,6 +302,22 @@ void route_map_no_match_ip_next_hop_prefix_list_hook(int (*func)(
rmap_match_set_hook.no_match_ip_next_hop_prefix_list = func;
}
+/* match ip next hop type */
+void route_map_match_ip_next_hop_type_hook(int (*func)(
+ struct vty *vty, struct route_map_index *index, const char *command,
+ const char *arg, route_map_event_t type))
+{
+ rmap_match_set_hook.match_ip_next_hop_type = func;
+}
+
+/* no match ip next hop type */
+void route_map_no_match_ip_next_hop_type_hook(int (*func)(
+ struct vty *vty, struct route_map_index *index, const char *command,
+ const char *arg, route_map_event_t type))
+{
+ rmap_match_set_hook.no_match_ip_next_hop_type = func;
+}
+
/* match ipv6 address */
void route_map_match_ipv6_address_hook(int (*func)(
struct vty *vty, struct route_map_index *index, const char *command,
@@ -308,6 +351,22 @@ void route_map_no_match_ipv6_address_prefix_list_hook(int (*func)(
rmap_match_set_hook.no_match_ipv6_address_prefix_list = func;
}
+/* match ipv6 next-hop type */
+void route_map_match_ipv6_next_hop_type_hook(int (*func)(
+ struct vty *vty, struct route_map_index *index, const char *command,
+ const char *arg, route_map_event_t type))
+{
+ rmap_match_set_hook.match_ipv6_next_hop_type = func;
+}
+
+/* no match ipv6 next-hop type */
+void route_map_no_match_ipv6_next_hop_type_hook(int (*func)(
+ struct vty *vty, struct route_map_index *index, const char *command,
+ const char *arg, route_map_event_t type))
+{
+ rmap_match_set_hook.no_match_ipv6_next_hop_type = func;
+}
+
/* match metric */
void route_map_match_metric_hook(int (*func)(
struct vty *vty, struct route_map_index *index, const char *command,
@@ -932,7 +991,7 @@ static int vty_show_route_map(struct vty *vty, const char *name)
for (ALL_LIST_ELEMENTS_RO(maplist, ln, map))
vty_show_route_map_entry(vty, map);
- list_delete_and_null(&maplist);
+ list_delete(&maplist);
}
return CMD_SUCCESS;
}
@@ -2034,6 +2093,45 @@ DEFUN (no_match_ip_next_hop_prefix_list,
return CMD_SUCCESS;
}
+DEFUN(match_ip_next_hop_type, match_ip_next_hop_type_cmd,
+ "match ip next-hop type <blackhole>",
+ MATCH_STR IP_STR
+ "Match next-hop address of route\n"
+ "Match entries by type\n"
+ "Blackhole\n")
+{
+ int idx_word = 4;
+ VTY_DECLVAR_CONTEXT(route_map_index, index);
+
+ if (rmap_match_set_hook.match_ip_next_hop_type)
+ return rmap_match_set_hook.match_ip_next_hop_type(
+ vty, index, "ip next-hop type", argv[idx_word]->arg,
+ RMAP_EVENT_MATCH_ADDED);
+ return CMD_SUCCESS;
+}
+
+DEFUN(no_match_ip_next_hop_type, no_match_ip_next_hop_type_cmd,
+ "no match ip next-hop type [<blackhole>]",
+ NO_STR MATCH_STR IP_STR
+ "Match next-hop address of route\n"
+ "Match entries by type\n"
+ "Blackhole\n")
+{
+ int idx_word = 5;
+ VTY_DECLVAR_CONTEXT(route_map_index, index);
+
+ if (rmap_match_set_hook.no_match_ip_next_hop) {
+ if (argc <= idx_word)
+ return rmap_match_set_hook.no_match_ip_next_hop(
+ vty, index, "ip next-hop type", NULL,
+ RMAP_EVENT_MATCH_DELETED);
+ return rmap_match_set_hook.no_match_ip_next_hop(
+ vty, index, "ip next-hop type", argv[idx_word]->arg,
+ RMAP_EVENT_MATCH_DELETED);
+ }
+ return CMD_SUCCESS;
+}
+
DEFUN (match_ipv6_address,
match_ipv6_address_cmd,
@@ -2112,6 +2210,39 @@ DEFUN (no_match_ipv6_address_prefix_list,
return CMD_SUCCESS;
}
+DEFUN(match_ipv6_next_hop_type, match_ipv6_next_hop_type_cmd,
+ "match ipv6 next-hop type <blackhole>",
+ MATCH_STR IPV6_STR
+ "Match address of route\n"
+ "Match entries by type\n"
+ "Blackhole\n")
+{
+ int idx_word = 4;
+ VTY_DECLVAR_CONTEXT(route_map_index, index);
+
+ if (rmap_match_set_hook.match_ipv6_next_hop_type)
+ return rmap_match_set_hook.match_ipv6_next_hop_type(
+ vty, index, "ipv6 next-hop type", argv[idx_word]->arg,
+ RMAP_EVENT_MATCH_ADDED);
+ return CMD_SUCCESS;
+}
+
+DEFUN(no_match_ipv6_next_hop_type, no_match_ipv6_next_hop_type_cmd,
+ "no match ipv6 next-hop type [<blackhole>]",
+ NO_STR MATCH_STR IPV6_STR
+ "Match address of route\n"
+ "Match entries by type\n"
+ "Blackhole\n")
+{
+ int idx_word = 5;
+ VTY_DECLVAR_CONTEXT(route_map_index, index);
+
+ if (rmap_match_set_hook.no_match_ipv6_next_hop_type)
+ return rmap_match_set_hook.no_match_ipv6_next_hop_type(
+ vty, index, "ipv6 next-hop type", argv[idx_word]->arg,
+ RMAP_EVENT_MATCH_DELETED);
+ return CMD_SUCCESS;
+}
DEFUN (match_metric,
match_metric_cmd,
@@ -2879,12 +3010,18 @@ void route_map_init(void)
install_element(RMAP_NODE, &match_ip_next_hop_prefix_list_cmd);
install_element(RMAP_NODE, &no_match_ip_next_hop_prefix_list_cmd);
+ install_element(RMAP_NODE, &match_ip_next_hop_type_cmd);
+ install_element(RMAP_NODE, &no_match_ip_next_hop_type_cmd);
+
install_element(RMAP_NODE, &match_ipv6_address_cmd);
install_element(RMAP_NODE, &no_match_ipv6_address_cmd);
install_element(RMAP_NODE, &match_ipv6_address_prefix_list_cmd);
install_element(RMAP_NODE, &no_match_ipv6_address_prefix_list_cmd);
+ install_element(RMAP_NODE, &match_ipv6_next_hop_type_cmd);
+ install_element(RMAP_NODE, &no_match_ipv6_next_hop_type_cmd);
+
install_element(RMAP_NODE, &match_metric_cmd);
install_element(RMAP_NODE, &no_match_metric_cmd);
diff --git a/lib/routemap.h b/lib/routemap.h
index 1914563687..481b8c4a9a 100644
--- a/lib/routemap.h
+++ b/lib/routemap.h
@@ -289,6 +289,14 @@ extern void route_map_match_ip_next_hop_prefix_list_hook(int (*func)(
extern void route_map_no_match_ip_next_hop_prefix_list_hook(int (*func)(
struct vty *vty, struct route_map_index *index, const char *command,
const char *arg, route_map_event_t type));
+/* match ip next hop type */
+extern void route_map_match_ip_next_hop_type_hook(int (*func)(
+ struct vty *vty, struct route_map_index *index, const char *command,
+ const char *arg, route_map_event_t type));
+/* no match ip next hop type */
+extern void route_map_no_match_ip_next_hop_type_hook(int (*func)(
+ struct vty *vty, struct route_map_index *index, const char *command,
+ const char *arg, route_map_event_t type));
/* match ipv6 address */
extern void route_map_match_ipv6_address_hook(int (*func)(
struct vty *vty, struct route_map_index *index, const char *command,
@@ -305,6 +313,14 @@ extern void route_map_match_ipv6_address_prefix_list_hook(int (*func)(
extern void route_map_no_match_ipv6_address_prefix_list_hook(int (*func)(
struct vty *vty, struct route_map_index *index, const char *command,
const char *arg, route_map_event_t type));
+/* match ipv6 next-hop type */
+extern void route_map_match_ipv6_next_hop_type_hook(int (*func)(
+ struct vty *vty, struct route_map_index *index, const char *command,
+ const char *arg, route_map_event_t type));
+/* no match ipv6 next-hop type */
+extern void route_map_no_match_ipv6_next_hop_type_hook(int (*func)(
+ struct vty *vty, struct route_map_index *index, const char *command,
+ const char *arg, route_map_event_t type));
/* match metric */
extern void route_map_match_metric_hook(int (*func)(
struct vty *vty, struct route_map_index *index, const char *command,
diff --git a/lib/subdir.am b/lib/subdir.am
index 499bb94920..dd2731f74c 100644
--- a/lib/subdir.am
+++ b/lib/subdir.am
@@ -2,7 +2,7 @@
# libfrr
#
lib_LTLIBRARIES += lib/libfrr.la
-lib_libfrr_la_LDFLAGS = -version-info 0:0:0
+lib_libfrr_la_LDFLAGS = -version-info 0:0:0 -Xlinker -e_libfrr_version
lib_libfrr_la_LIBADD = @LIBCAP@
lib_libfrr_la_SOURCES = \
@@ -82,6 +82,7 @@ lib_libfrr_la_SOURCES = \
lib/workqueue.c \
lib/zclient.c \
lib/logicalrouter.c \
+ lib/lua.c \
# end
vtysh_scan += \
@@ -190,6 +191,7 @@ pkginclude_HEADERS += \
lib/zclient.h \
lib/zebra.h \
lib/logicalrouter.h \
+ lib/lua.h \
lib/pbr.h \
# end
@@ -205,6 +207,17 @@ noinst_HEADERS += \
lib/plist_int.h \
#end
+# General note about module and module helper library (libfrrsnmp, libfrrzmq)
+# linking: If we're linking libfrr statically into daemons, we *must* remove
+# libfrr from modules because modules will always link it in dynamically and
+# thus 2 copies of libfrr will be loaded... hilarity ensues.
+#
+# Not linking libfrr into modules should generally work fine because the
+# executable refers to libfrr either way and the dynamic linker should make
+# libfrr available to modules. If some OS platform has a dynamic linker that
+# doesn't do that, libfrr needs to be readded to modules, but _only_ _if_
+# it's not linked into daemons statically.
+
#
# SNMP support
#
@@ -214,7 +227,7 @@ endif
lib_libfrrsnmp_la_CFLAGS = $(WERROR) $(SNMP_CFLAGS) -std=gnu99
lib_libfrrsnmp_la_LDFLAGS = -version-info 0:0:0
-lib_libfrrsnmp_la_LIBADD = lib/libfrr.la $(SNMP_LIBS)
+lib_libfrrsnmp_la_LIBADD = $(SNMP_LIBS)
lib_libfrrsnmp_la_SOURCES = \
lib/agentx.c \
lib/snmp.c \
@@ -230,7 +243,7 @@ endif
lib_libfrrzmq_la_CFLAGS = $(WERROR) $(ZEROMQ_CFLAGS)
lib_libfrrzmq_la_LDFLAGS = -version-info 0:0:0
-lib_libfrrzmq_la_LIBADD = lib/libfrr.la $(ZEROMQ_LIBS)
+lib_libfrrzmq_la_LIBADD = $(ZEROMQ_LIBS)
lib_libfrrzmq_la_SOURCES = \
lib/frr_zmq.c \
#end
diff --git a/lib/thread.c b/lib/thread.c
index 2c3db27c7b..a81faae796 100644
--- a/lib/thread.c
+++ b/lib/thread.c
@@ -622,7 +622,7 @@ void thread_master_free(struct thread_master *m)
{
listnode_delete(masters, m);
if (masters->count == 0) {
- list_delete_and_null(&masters);
+ list_delete(&masters);
}
}
pthread_mutex_unlock(&masters_mtx);
@@ -637,7 +637,7 @@ void thread_master_free(struct thread_master *m)
pthread_cond_destroy(&m->cancel_cond);
close(m->io_pipe[0]);
close(m->io_pipe[1]);
- list_delete_and_null(&m->cancel_req);
+ list_delete(&m->cancel_req);
m->cancel_req = NULL;
hash_clean(m->cpu_record, cpu_record_hash_free);
diff --git a/lib/wheel.c b/lib/wheel.c
index 722b02424a..69d2fa48dc 100644
--- a/lib/wheel.c
+++ b/lib/wheel.c
@@ -115,7 +115,7 @@ void wheel_delete(struct timer_wheel *wheel)
int i;
for (i = 0; i < wheel->slots; i++) {
- list_delete_and_null(&wheel->wheel_slot_lists[i]);
+ list_delete(&wheel->wheel_slot_lists[i]);
}
THREAD_OFF(wheel->timer);
diff --git a/lib/zclient.c b/lib/zclient.c
index e6626a178b..8b1069b827 100644
--- a/lib/zclient.c
+++ b/lib/zclient.c
@@ -133,7 +133,7 @@ void redist_del_instance(struct redist_proto *red, unsigned short instance)
XFREE(MTYPE_REDIST_INST, id);
if (!red->instances->count) {
red->enabled = 0;
- list_delete_and_null(&red->instances);
+ list_delete(&red->instances);
}
}
diff --git a/m4/.gitignore b/m4/.gitignore
index 357e65588d..2c04163659 100644
--- a/m4/.gitignore
+++ b/m4/.gitignore
@@ -1,4 +1,5 @@
*.m4
+!*.patch
!ax_compare_version.m4
!ax_prog_perl_modules.m4
diff --git a/m4/libtool-whole-archive.patch b/m4/libtool-whole-archive.patch
new file mode 100644
index 0000000000..7e2749c90a
--- /dev/null
+++ b/m4/libtool-whole-archive.patch
@@ -0,0 +1,18 @@
+--- /usr/share/libtool/build-aux/ltmain.sh 2017-08-01 07:13:09.611041402 +0200
++++ ltmain.sh 2018-08-31 17:32:15.381903718 +0200
+@@ -8439,8 +8439,13 @@
+ # shared platforms.
+ if test unsupported != "$hardcode_direct"; then
+ test -n "$old_library" && linklib=$old_library
+- compile_deplibs="$dir/$linklib $compile_deplibs"
+- finalize_deplibs="$dir/$linklib $finalize_deplibs"
++ if test yes,yes = "$export_dynamic,$with_gnu_ld"; then
++ compile_deplibs="-Wl,--no-whole-archive $dir/$linklib -Wl,--whole-archive $compile_deplibs"
++ finalize_deplibs="-Wl,--no-whole-archive $dir/$linklib -Wl,--whole-archive $finalize_deplibs"
++ else
++ compile_deplibs="$dir/$linklib $compile_deplibs"
++ finalize_deplibs="$dir/$linklib $finalize_deplibs"
++ fi
+ else
+ compile_deplibs="-l$name -L$dir $compile_deplibs"
+ finalize_deplibs="-l$name -L$dir $finalize_deplibs"
diff --git a/ospf6d/ospf6_abr.c b/ospf6d/ospf6_abr.c
index 586584c65c..1890e9bdc3 100644
--- a/ospf6d/ospf6_abr.c
+++ b/ospf6d/ospf6_abr.c
@@ -171,8 +171,9 @@ int ospf6_abr_originate_summary_to_area(struct ospf6_route *route,
/* AS External routes are never considered */
if (route->path.type == OSPF6_PATH_TYPE_EXTERNAL1
|| route->path.type == OSPF6_PATH_TYPE_EXTERNAL2) {
- if (is_debug)
- zlog_debug("Path type is external, skip");
+#if 0
+ zlog_debug("Path type is external, skip");
+#endif
return 0;
}
@@ -1004,6 +1005,7 @@ void ospf6_abr_examin_summary(struct ospf6_lsa *lsa, struct ospf6_area *oa)
if (lsa->header->type == htons(OSPF6_LSTYPE_INTER_ROUTER)) {
/* To pass test suites */
+ assert(router_lsa);
if (!OSPF6_OPT_ISSET(router_lsa->options, OSPF6_OPT_R)
|| !OSPF6_OPT_ISSET(router_lsa->options, OSPF6_OPT_V6)) {
if (is_debug)
diff --git a/ospf6d/ospf6_area.c b/ospf6d/ospf6_area.c
index 2cab69aac2..c848a16aa9 100644
--- a/ospf6d/ospf6_area.c
+++ b/ospf6d/ospf6_area.c
@@ -277,7 +277,7 @@ void ospf6_area_delete(struct ospf6_area *oa)
for (ALL_LIST_ELEMENTS_RO(oa->if_list, n, oi))
oi->area = NULL;
- list_delete_and_null(&oa->if_list);
+ list_delete(&oa->if_list);
ospf6_lsdb_delete(oa->lsdb);
ospf6_lsdb_delete(oa->lsdb_self);
@@ -441,6 +441,7 @@ DEFUN (area_range,
SET_FLAG(range->flag, OSPF6_ROUTE_DO_NOT_ADVERTISE);
} else if (strmatch(argv[idx_type]->text, "advertise")) {
UNSET_FLAG(range->flag, OSPF6_ROUTE_DO_NOT_ADVERTISE);
+ cost = range->path.u.cost_config;
} else {
cost = strtoul(argv[5]->arg, NULL, 10);
UNSET_FLAG(range->flag, OSPF6_ROUTE_DO_NOT_ADVERTISE);
diff --git a/ospf6d/ospf6_interface.c b/ospf6d/ospf6_interface.c
index 9777a01ae6..17a30188c7 100644
--- a/ospf6d/ospf6_interface.c
+++ b/ospf6d/ospf6_interface.c
@@ -241,7 +241,7 @@ void ospf6_interface_delete(struct ospf6_interface *oi)
for (ALL_LIST_ELEMENTS(oi->neighbor_list, node, nnode, on))
ospf6_neighbor_delete(on);
- list_delete_and_null(&oi->neighbor_list);
+ list_delete(&oi->neighbor_list);
THREAD_OFF(oi->thread_send_hello);
THREAD_OFF(oi->thread_send_lsupdate);
diff --git a/ospf6d/ospf6_route.c b/ospf6d/ospf6_route.c
index bba3c0db5e..79e1a44392 100644
--- a/ospf6d/ospf6_route.c
+++ b/ospf6d/ospf6_route.c
@@ -365,7 +365,7 @@ static int ospf6_path_cmp(struct ospf6_path *a, struct ospf6_path *b)
void ospf6_path_free(struct ospf6_path *op)
{
if (op->nh_list)
- list_delete_and_null(&op->nh_list);
+ list_delete(&op->nh_list);
XFREE(MTYPE_OSPF6_PATH, op);
}
@@ -413,9 +413,9 @@ void ospf6_route_delete(struct ospf6_route *route)
{
if (route) {
if (route->nh_list)
- list_delete_and_null(&route->nh_list);
+ list_delete(&route->nh_list);
if (route->paths)
- list_delete_and_null(&route->paths);
+ list_delete(&route->paths);
XFREE(MTYPE_OSPF6_ROUTE, route);
}
}
diff --git a/ospf6d/ospf6_spf.c b/ospf6d/ospf6_spf.c
index d9ddc1bb83..2d271c1dab 100644
--- a/ospf6d/ospf6_spf.c
+++ b/ospf6d/ospf6_spf.c
@@ -158,8 +158,8 @@ static struct ospf6_vertex *ospf6_vertex_create(struct ospf6_lsa *lsa)
static void ospf6_vertex_delete(struct ospf6_vertex *v)
{
- list_delete_and_null(&v->nh_list);
- list_delete_and_null(&v->child_list);
+ list_delete(&v->nh_list);
+ list_delete(&v->child_list);
XFREE(MTYPE_OSPF6_VERTEX, v);
}
diff --git a/ospf6d/ospf6_top.c b/ospf6d/ospf6_top.c
index ca1a65ff0b..901a35ccfa 100644
--- a/ospf6d/ospf6_top.c
+++ b/ospf6d/ospf6_top.c
@@ -202,7 +202,7 @@ void ospf6_delete(struct ospf6 *o)
ospf6_area_delete(oa);
- list_delete_and_null(&o->area_list);
+ list_delete(&o->area_list);
ospf6_lsdb_delete(o->lsdb);
ospf6_lsdb_delete(o->lsdb_self);
diff --git a/ospfclient/subdir.am b/ospfclient/subdir.am
index df7d85a1f5..d42c5b450e 100644
--- a/ospfclient/subdir.am
+++ b/ospfclient/subdir.am
@@ -23,9 +23,21 @@ endif
ospfclient_ospfclient_LDADD = \
ospfclient/libfrrospfapiclient.la \
- lib/libfrr.la \
@LIBCAP@ \
# end
+
+if STATIC_BIN
+# libfrr is linked in through libfrrospfapiclient. If we list it here too,
+# it gets linked twice and we get a ton of symbol collisions.
+
+else # !STATIC_BIN
+# For most systems we don't need this, except Debian, who patch their linker
+# to disallow transitive references *while* *als* not patching their libtool
+# to work appropriately. RedHat has the same linker behaviour, but things
+# work as expected since they also patch libtool.
+ospfclient_ospfclient_LDADD += lib/libfrr.la
+endif
+
ospfclient_ospfclient_SOURCES = \
ospfclient/ospfclient.c \
# end
diff --git a/ospfd/ospf_abr.c b/ospfd/ospf_abr.c
index 870037efc0..c8b8b611ef 100644
--- a/ospfd/ospf_abr.c
+++ b/ospfd/ospf_abr.c
@@ -196,6 +196,8 @@ int ospf_area_range_set(struct ospf *ospf, struct in_addr area_id,
range = ospf_area_range_lookup(area, p);
if (range != NULL) {
+ if (!CHECK_FLAG(advertise, OSPF_AREA_RANGE_ADVERTISE))
+ range->cost_config = OSPF_AREA_RANGE_COST_UNSPEC;
if ((CHECK_FLAG(range->flags, OSPF_AREA_RANGE_ADVERTISE)
&& !CHECK_FLAG(advertise, OSPF_AREA_RANGE_ADVERTISE))
|| (!CHECK_FLAG(range->flags, OSPF_AREA_RANGE_ADVERTISE)
@@ -209,8 +211,10 @@ int ospf_area_range_set(struct ospf *ospf, struct in_addr area_id,
if (CHECK_FLAG(advertise, OSPF_AREA_RANGE_ADVERTISE))
SET_FLAG(range->flags, OSPF_AREA_RANGE_ADVERTISE);
- else
+ else {
UNSET_FLAG(range->flags, OSPF_AREA_RANGE_ADVERTISE);
+ range->cost_config = OSPF_AREA_RANGE_COST_UNSPEC;
+ }
return 1;
}
diff --git a/ospfd/ospf_apiserver.c b/ospfd/ospf_apiserver.c
index 0f76527950..d0ee818722 100644
--- a/ospfd/ospf_apiserver.c
+++ b/ospfd/ospf_apiserver.c
@@ -182,7 +182,7 @@ void ospf_apiserver_term(void)
/* Free client list itself */
if (apiserver_list)
- list_delete_and_null(&apiserver_list);
+ list_delete(&apiserver_list);
/* Free wildcard list */
/* XXX */
diff --git a/ospfd/ospf_ase.c b/ospfd/ospf_ase.c
index 0221d1e1b2..9492de544f 100644
--- a/ospfd/ospf_ase.c
+++ b/ospfd/ospf_ase.c
@@ -77,7 +77,7 @@ struct ospf_route *ospf_find_asbr_route(struct ospf *ospf,
/* If none is found -- look through all. */
if (listcount(chosen) == 0) {
- list_delete_and_null(&chosen);
+ list_delete(&chosen);
chosen = rn->info;
}
@@ -98,7 +98,7 @@ struct ospf_route *ospf_find_asbr_route(struct ospf *ospf,
}
if (chosen != rn->info)
- list_delete_and_null(&chosen);
+ list_delete(&chosen);
return best;
}
@@ -775,7 +775,7 @@ void ospf_ase_external_lsas_finish(struct route_table *rt)
if ((lst = rn->info) != NULL) {
for (ALL_LIST_ELEMENTS(lst, node, nnode, lsa))
ospf_lsa_unlock(&lsa); /* external_lsas lst */
- list_delete_and_null(&lst);
+ list_delete(&lst);
}
route_table_finish(rt);
diff --git a/ospfd/ospf_dump.c b/ospfd/ospf_dump.c
index d8742943c0..48d210d279 100644
--- a/ospfd/ospf_dump.c
+++ b/ospfd/ospf_dump.c
@@ -1799,7 +1799,7 @@ static int config_write_debug(struct vty *vty)
}
/* Initialize debug commands. */
-void debug_init()
+void ospf_debug_init(void)
{
install_node(&debug_node, config_write_debug);
diff --git a/ospfd/ospf_dump.h b/ospfd/ospf_dump.h
index 99d7512f16..397f666f69 100644
--- a/ospfd/ospf_dump.h
+++ b/ospfd/ospf_dump.h
@@ -140,7 +140,7 @@ extern const char *ospf_timer_dump(struct thread *, char *, size_t);
extern const char *ospf_timeval_dump(struct timeval *, char *, size_t);
extern void ospf_ip_header_dump(struct ip *);
extern void ospf_packet_dump(struct stream *);
-extern void debug_init(void);
+extern void ospf_debug_init(void);
/* Appropriate buffer size to use with ospf_timer_dump and ospf_timeval_dump: */
#define OSPF_TIME_DUMP_SIZE 16
diff --git a/ospfd/ospf_ext.c b/ospfd/ospf_ext.c
index 316019c159..df64fca883 100644
--- a/ospfd/ospf_ext.c
+++ b/ospfd/ospf_ext.c
@@ -185,7 +185,7 @@ void ospf_ext_term(void)
ospf_delete_opaque_functab(OSPF_OPAQUE_AREA_LSA,
OPAQUE_TYPE_EXTENDED_LINK_LSA);
- list_delete_and_null(&OspfEXT.iflist);
+ list_delete(&OspfEXT.iflist);
OspfEXT.scope = 0;
OspfEXT.enabled = false;
diff --git a/ospfd/ospf_interface.c b/ospfd/ospf_interface.c
index 2ad36ae364..ddb25a20f6 100644
--- a/ospfd/ospf_interface.c
+++ b/ospfd/ospf_interface.c
@@ -341,10 +341,10 @@ void ospf_if_free(struct ospf_interface *oi)
route_table_finish(oi->ls_upd_queue);
/* Free any lists that should be freed */
- list_delete_and_null(&oi->nbr_nbma);
+ list_delete(&oi->nbr_nbma);
- list_delete_and_null(&oi->ls_ack);
- list_delete_and_null(&oi->ls_ack_direct.ls_ack);
+ list_delete(&oi->ls_ack);
+ list_delete(&oi->ls_ack_direct.ls_ack);
if (IS_DEBUG_OSPF_EVENT)
zlog_debug("%s: ospf interface %s vrf %s id %u deleted",
@@ -545,7 +545,7 @@ static struct ospf_if_params *ospf_new_if_params(void)
void ospf_del_if_params(struct ospf_if_params *oip)
{
- list_delete_and_null(&oip->auth_crypt);
+ list_delete(&oip->auth_crypt);
bfd_info_free(&(oip->bfd_info));
XFREE(MTYPE_OSPF_IF_PARAMS, oip);
}
diff --git a/ospfd/ospf_ism.c b/ospfd/ospf_ism.c
index 25ab9cbe0f..ad9b3efe6e 100644
--- a/ospfd/ospf_ism.c
+++ b/ospfd/ospf_ism.c
@@ -104,7 +104,7 @@ static struct ospf_neighbor *ospf_elect_dr(struct ospf_interface *oi,
else
DR(oi).s_addr = 0;
- list_delete_and_null(&dr_list);
+ list_delete(&dr_list);
return dr;
}
@@ -144,8 +144,8 @@ static struct ospf_neighbor *ospf_elect_bdr(struct ospf_interface *oi,
else
BDR(oi).s_addr = 0;
- list_delete_and_null(&bdr_list);
- list_delete_and_null(&no_dr_list);
+ list_delete(&bdr_list);
+ list_delete(&no_dr_list);
return bdr;
}
@@ -232,7 +232,7 @@ static int ospf_dr_election(struct ospf_interface *oi)
zlog_debug("DR-Election[2nd]: DR %s", inet_ntoa(DR(oi)));
}
- list_delete_and_null(&el_list);
+ list_delete(&el_list);
/* if DR or BDR changes, cause AdjOK? neighbor event. */
if (!IPV4_ADDR_SAME(&old_dr, &DR(oi))
diff --git a/ospfd/ospf_lsa.c b/ospfd/ospf_lsa.c
index cca1baa544..288ce43f79 100644
--- a/ospfd/ospf_lsa.c
+++ b/ospfd/ospf_lsa.c
@@ -1891,7 +1891,7 @@ struct ospf_lsa *ospf_translated_nssa_refresh(struct ospf *ospf,
zlog_debug(
"ospf_translated_nssa_refresh(): no Type-7 found for "
"Type-5 LSA Id %s",
- type5 ? inet_ntoa(type5->data->id) : "(null)");
+ inet_ntoa(type5->data->id));
return NULL;
}
@@ -3633,7 +3633,7 @@ void ospf_refresher_unregister_lsa(struct ospf *ospf, struct ospf_lsa *lsa)
ospf->lsa_refresh_queue.qs[lsa->refresh_list];
listnode_delete(refresh_list, lsa);
if (!listcount(refresh_list)) {
- list_delete_and_null(&refresh_list);
+ list_delete(&refresh_list);
ospf->lsa_refresh_queue.qs[lsa->refresh_list] = NULL;
}
ospf_lsa_unlock(&lsa); /* lsa_refresh_queue */
@@ -3702,7 +3702,7 @@ int ospf_lsa_refresh_walker(struct thread *t)
lsa->refresh_list = -1;
listnode_add(lsa_to_refresh, lsa);
}
- list_delete_and_null(&refresh_list);
+ list_delete(&refresh_list);
}
}
@@ -3718,7 +3718,7 @@ int ospf_lsa_refresh_walker(struct thread *t)
&lsa); /* lsa_refresh_queue & temp for lsa_to_refresh*/
}
- list_delete_and_null(&lsa_to_refresh);
+ list_delete(&lsa_to_refresh);
if (IS_DEBUG_OSPF(lsa, LSA_REFRESH))
zlog_debug("LSA[Refresh]: ospf_lsa_refresh_walker(): end");
diff --git a/ospfd/ospf_main.c b/ospfd/ospf_main.c
index 9fb0e0ad13..20632f2840 100644
--- a/ospfd/ospf_main.c
+++ b/ospfd/ospf_main.c
@@ -187,7 +187,7 @@ int main(int argc, char **argv)
master = om->master;
/* Library inits. */
- debug_init();
+ ospf_debug_init();
ospf_vrf_init();
access_list_init();
diff --git a/ospfd/ospf_opaque.c b/ospfd/ospf_opaque.c
index e3c830d71b..7f96299768 100644
--- a/ospfd/ospf_opaque.c
+++ b/ospfd/ospf_opaque.c
@@ -136,7 +136,7 @@ void ospf_opaque_finish(void)
int ospf_opaque_type9_lsa_init(struct ospf_interface *oi)
{
if (oi->opaque_lsa_self != NULL)
- list_delete_and_null(&oi->opaque_lsa_self);
+ list_delete(&oi->opaque_lsa_self);
oi->opaque_lsa_self = list_new();
oi->opaque_lsa_self->del = free_opaque_info_per_type;
@@ -148,7 +148,7 @@ void ospf_opaque_type9_lsa_term(struct ospf_interface *oi)
{
OSPF_TIMER_OFF(oi->t_opaque_lsa_self);
if (oi->opaque_lsa_self != NULL)
- list_delete_and_null(&oi->opaque_lsa_self);
+ list_delete(&oi->opaque_lsa_self);
oi->opaque_lsa_self = NULL;
return;
}
@@ -156,7 +156,7 @@ void ospf_opaque_type9_lsa_term(struct ospf_interface *oi)
int ospf_opaque_type10_lsa_init(struct ospf_area *area)
{
if (area->opaque_lsa_self != NULL)
- list_delete_and_null(&area->opaque_lsa_self);
+ list_delete(&area->opaque_lsa_self);
area->opaque_lsa_self = list_new();
area->opaque_lsa_self->del = free_opaque_info_per_type;
@@ -177,14 +177,14 @@ void ospf_opaque_type10_lsa_term(struct ospf_area *area)
OSPF_TIMER_OFF(area->t_opaque_lsa_self);
if (area->opaque_lsa_self != NULL)
- list_delete_and_null(&area->opaque_lsa_self);
+ list_delete(&area->opaque_lsa_self);
return;
}
int ospf_opaque_type11_lsa_init(struct ospf *top)
{
if (top->opaque_lsa_self != NULL)
- list_delete_and_null(&top->opaque_lsa_self);
+ list_delete(&top->opaque_lsa_self);
top->opaque_lsa_self = list_new();
top->opaque_lsa_self->del = free_opaque_info_per_type;
@@ -205,7 +205,7 @@ void ospf_opaque_type11_lsa_term(struct ospf *top)
OSPF_TIMER_OFF(top->t_opaque_lsa_self);
if (top->opaque_lsa_self != NULL)
- list_delete_and_null(&top->opaque_lsa_self);
+ list_delete(&top->opaque_lsa_self);
return;
}
@@ -314,16 +314,16 @@ static void ospf_opaque_funclist_term(void)
struct list *funclist;
funclist = ospf_opaque_wildcard_funclist;
- list_delete_and_null(&funclist);
+ list_delete(&funclist);
funclist = ospf_opaque_type9_funclist;
- list_delete_and_null(&funclist);
+ list_delete(&funclist);
funclist = ospf_opaque_type10_funclist;
- list_delete_and_null(&funclist);
+ list_delete(&funclist);
funclist = ospf_opaque_type11_funclist;
- list_delete_and_null(&funclist);
+ list_delete(&funclist);
return;
}
@@ -633,7 +633,7 @@ static void free_opaque_info_per_type(void *val)
}
OSPF_TIMER_OFF(oipt->t_opaque_lsa_self);
- list_delete_and_null(&oipt->id_list);
+ list_delete(&oipt->id_list);
XFREE(MTYPE_OPAQUE_INFO_PER_TYPE, oipt);
return;
}
diff --git a/ospfd/ospf_packet.c b/ospfd/ospf_packet.c
index c4c4d2f030..359d59cb58 100644
--- a/ospfd/ospf_packet.c
+++ b/ospfd/ospf_packet.c
@@ -525,7 +525,7 @@ int ospf_ls_upd_timer(struct thread *thread)
if (listcount(update) > 0)
ospf_ls_upd_send(nbr, update, OSPF_SEND_PACKET_DIRECT,
0);
- list_delete_and_null(&update);
+ list_delete(&update);
}
/* Set LS Update retransmission timer. */
@@ -1620,7 +1620,7 @@ static void ospf_ls_req(struct ip *iph, struct ospf_header *ospfh,
/* Verify LSA type. */
if (ls_type < OSPF_MIN_LSA || ls_type >= OSPF_MAX_LSA) {
OSPF_NSM_EVENT_SCHEDULE(nbr, NSM_BadLSReq);
- list_delete_and_null(&ls_upd);
+ list_delete(&ls_upd);
return;
}
@@ -1629,7 +1629,7 @@ static void ospf_ls_req(struct ip *iph, struct ospf_header *ospfh,
adv_router);
if (find == NULL) {
OSPF_NSM_EVENT_SCHEDULE(nbr, NSM_BadLSReq);
- list_delete_and_null(&ls_upd);
+ list_delete(&ls_upd);
return;
}
@@ -1664,9 +1664,9 @@ static void ospf_ls_req(struct ip *iph, struct ospf_header *ospfh,
ospf_ls_upd_send(nbr, ls_upd, OSPF_SEND_PACKET_INDIRECT,
0);
- list_delete_and_null(&ls_upd);
+ list_delete(&ls_upd);
} else
- list_delete_and_null(&ls_upd);
+ list_delete(&ls_upd);
}
/* Get the list of LSAs from Link State Update packet.
@@ -1811,7 +1811,7 @@ static void ospf_upd_list_clean(struct list *lsas)
for (ALL_LIST_ELEMENTS(lsas, node, nnode, lsa))
ospf_lsa_discard(lsa);
- list_delete_and_null(&lsas);
+ list_delete(&lsas);
}
/* OSPF Link State Update message read -- RFC2328 Section 13. */
@@ -2215,7 +2215,7 @@ static void ospf_ls_upd(struct ospf *ospf, struct ip *iph,
#undef DISCARD_LSA
assert(listcount(lsas) == 0);
- list_delete_and_null(&lsas);
+ list_delete(&lsas);
}
/* OSPF Link State Acknowledgment message read -- RFC2328 Section 13.7. */
@@ -3855,7 +3855,7 @@ void ospf_ls_upd_send_lsa(struct ospf_neighbor *nbr, struct ospf_lsa *lsa,
else
ospf_ls_upd_send(nbr, update, flag, 0);
- list_delete_and_null(&update);
+ list_delete(&update);
}
/* Determine size for packet. Must be at least big enough to accomodate next
@@ -4016,7 +4016,7 @@ static int ospf_ls_upd_send_queue_event(struct thread *thread)
/* list might not be empty. */
if (listcount(update) == 0) {
- list_delete_and_null((struct list **)&rn->info);
+ list_delete((struct list **)&rn->info);
route_unlock_node(rn);
} else
again = 1;
diff --git a/ospfd/ospf_ri.c b/ospfd/ospf_ri.c
index 22262c804f..3b0319b591 100644
--- a/ospfd/ospf_ri.c
+++ b/ospfd/ospf_ri.c
@@ -217,8 +217,8 @@ static int ospf_router_info_unregister()
void ospf_router_info_term(void)
{
- list_delete_and_null(&OspfRI.pce_info.pce_domain);
- list_delete_and_null(&OspfRI.pce_info.pce_neighbor);
+ list_delete(&OspfRI.pce_info.pce_domain);
+ list_delete(&OspfRI.pce_info.pce_neighbor);
OspfRI.enabled = false;
diff --git a/ospfd/ospf_route.c b/ospfd/ospf_route.c
index b36f2f4652..7ee91b5b6c 100644
--- a/ospfd/ospf_route.c
+++ b/ospfd/ospf_route.c
@@ -54,7 +54,7 @@ struct ospf_route *ospf_route_new()
void ospf_route_free(struct ospf_route * or)
{
if (or->paths)
- list_delete_and_null(& or->paths);
+ list_delete(& or->paths);
XFREE(MTYPE_OSPF_ROUTE, or);
}
@@ -905,7 +905,7 @@ void ospf_prune_unreachable_routers(struct route_table *rtrs)
zlog_debug("Pruning router node %s",
inet_ntoa(rn->p.u.prefix4));
- list_delete_and_null(&paths);
+ list_delete(&paths);
rn->info = NULL;
route_unlock_node(rn);
}
diff --git a/ospfd/ospf_spf.c b/ospfd/ospf_spf.c
index 7896fb632a..9c223facd3 100644
--- a/ospfd/ospf_spf.c
+++ b/ospfd/ospf_spf.c
@@ -209,10 +209,10 @@ static void ospf_vertex_free(void *data)
// assert (listcount (v->parents) == 0);
if (v->children)
- list_delete_and_null(&v->children);
+ list_delete(&v->children);
if (v->parents)
- list_delete_and_null(&v->parents);
+ list_delete(&v->parents);
v->lsa = NULL;
@@ -1086,7 +1086,7 @@ void ospf_rtrs_free(struct route_table *rtrs)
for (ALL_LIST_ELEMENTS(or_list, node, nnode, or))
ospf_route_free(or);
- list_delete_and_null(&or_list);
+ list_delete(&or_list);
/* Unlock the node. */
rn->info = NULL;
diff --git a/ospfd/ospf_sr.c b/ospfd/ospf_sr.c
index 33ec09b9f3..d793735003 100644
--- a/ospfd/ospf_sr.c
+++ b/ospfd/ospf_sr.c
@@ -165,10 +165,10 @@ static void sr_node_del(struct sr_node *srn)
return;
/* Clean Extended Link */
- list_delete_and_null(&srn->ext_link);
+ list_delete(&srn->ext_link);
/* Clean Prefix List */
- list_delete_and_null(&srn->ext_prefix);
+ list_delete(&srn->ext_prefix);
XFREE(MTYPE_OSPF_SR_PARAMS, srn);
}
@@ -283,7 +283,7 @@ static void ospf_sr_stop(void)
/*
* Remove all SR Nodes from the Hash table. Prefix and Link SID will
- * be remove though list_delete_and_null() call. See sr_node_del()
+ * be remove though list_delete() call. See sr_node_del()
*/
hash_clean(OspfSR.neighbors, (void *)sr_node_del);
}
diff --git a/ospfd/ospf_te.c b/ospfd/ospf_te.c
index 12122e7646..f43038ab8d 100644
--- a/ospfd/ospf_te.c
+++ b/ospfd/ospf_te.c
@@ -169,7 +169,7 @@ static int ospf_mpls_te_unregister()
void ospf_mpls_te_term(void)
{
- list_delete_and_null(&OspfMplsTE.iflist);
+ list_delete(&OspfMplsTE.iflist);
ospf_delete_opaque_functab(OSPF_OPAQUE_AREA_LSA,
OPAQUE_TYPE_TRAFFIC_ENGINEERING_LSA);
diff --git a/ospfd/ospf_vty.c b/ospfd/ospf_vty.c
index e25d1a31de..25d54a8553 100644
--- a/ospfd/ospf_vty.c
+++ b/ospfd/ospf_vty.c
@@ -750,6 +750,7 @@ DEFUN (ospf_area_range_not_advertise,
ospf_area_range_set(ospf, area_id, &p, 0);
ospf_area_display_format_set(ospf, ospf_area_get(ospf, area_id),
format);
+ ospf_area_range_substitute_unset(ospf, area_id, &p);
return CMD_SUCCESS;
}
diff --git a/ospfd/ospf_zebra.c b/ospfd/ospf_zebra.c
index 8a7f38b743..fdb87bd1ff 100644
--- a/ospfd/ospf_zebra.c
+++ b/ospfd/ospf_zebra.c
@@ -583,7 +583,7 @@ void ospf_external_del(struct ospf *ospf, uint8_t type, unsigned short instance)
listnode_delete(ospf->external[type], ext);
if (!ospf->external[type]->count)
- list_delete_and_null(&ospf->external[type]);
+ list_delete(&ospf->external[type]);
XFREE(MTYPE_OSPF_EXTERNAL, ext);
}
@@ -641,7 +641,7 @@ void ospf_redist_del(struct ospf *ospf, uint8_t type, unsigned short instance)
if (red) {
listnode_delete(ospf->redist[type], red);
if (!ospf->redist[type]->count) {
- list_delete_and_null(&ospf->redist[type]);
+ list_delete(&ospf->redist[type]);
}
ospf_routemap_unset(red);
XFREE(MTYPE_OSPF_REDISTRIBUTE, red);
diff --git a/ospfd/ospfd.c b/ospfd/ospfd.c
index d481e9e4c8..dc54f04c07 100644
--- a/ospfd/ospfd.c
+++ b/ospfd/ospfd.c
@@ -635,7 +635,7 @@ static void ospf_finish_final(struct ospf *ospf)
for (ALL_LIST_ELEMENTS(ospf->vlinks, node, nnode, vl_data))
ospf_vl_delete(ospf, vl_data);
- list_delete_and_null(&ospf->vlinks);
+ list_delete(&ospf->vlinks);
/* Remove any ospf interface config params */
FOR_ALL_INTERFACES (vrf, ifp) {
@@ -649,7 +649,7 @@ static void ospf_finish_final(struct ospf *ospf)
/* Reset interface. */
for (ALL_LIST_ELEMENTS(ospf->oiflist, node, nnode, oi))
ospf_if_free(oi);
- list_delete_and_null(&ospf->oiflist);
+ list_delete(&ospf->oiflist);
/* De-Register VRF */
ospf_zebra_vrf_deregister(ospf);
@@ -749,8 +749,8 @@ static void ospf_finish_final(struct ospf *ospf)
ospf_ase_external_lsas_finish(ospf->external_lsas);
}
- list_delete_and_null(&ospf->areas);
- list_delete_and_null(&ospf->oi_write_q);
+ list_delete(&ospf->areas);
+ list_delete(&ospf->oi_write_q);
for (i = ZEBRA_ROUTE_SYSTEM; i <= ZEBRA_ROUTE_MAX; i++) {
struct list *ext_list;
@@ -866,7 +866,7 @@ static void ospf_area_free(struct ospf_area *area)
ospf_lsa_unlock(&area->router_lsa_self);
route_table_finish(area->ranges);
- list_delete_and_null(&area->oiflist);
+ list_delete(&area->oiflist);
if (EXPORT_NAME(area))
free(EXPORT_NAME(area));
@@ -1297,7 +1297,7 @@ void ospf_ls_upd_queue_empty(struct ospf_interface *oi)
if ((lst = (struct list *)rn->info)) {
for (ALL_LIST_ELEMENTS(lst, node, nnode, lsa))
ospf_lsa_unlock(&lsa); /* oi->ls_upd_queue */
- list_delete_and_null(&lst);
+ list_delete(&lst);
rn->info = NULL;
}
diff --git a/pimd/pim_hello.c b/pimd/pim_hello.c
index b6c5bc432d..e482d321a4 100644
--- a/pimd/pim_hello.c
+++ b/pimd/pim_hello.c
@@ -127,7 +127,7 @@ static void tlv_trace_list(const char *label, const char *tlv_name,
#define FREE_ADDR_LIST \
if (hello_option_addr_list) { \
- list_delete_and_null(&hello_option_addr_list); \
+ list_delete(&hello_option_addr_list); \
}
#define FREE_ADDR_LIST_THEN_RETURN(code) \
diff --git a/pimd/pim_iface.c b/pimd/pim_iface.c
index 249b24c0d7..1ad71823b8 100644
--- a/pimd/pim_iface.c
+++ b/pimd/pim_iface.c
@@ -201,10 +201,10 @@ void pim_if_delete(struct interface *ifp)
pim_if_del_vif(ifp);
- list_delete_and_null(&pim_ifp->igmp_socket_list);
- list_delete_and_null(&pim_ifp->pim_neighbor_list);
- list_delete_and_null(&pim_ifp->upstream_switch_list);
- list_delete_and_null(&pim_ifp->sec_addr_list);
+ list_delete(&pim_ifp->igmp_socket_list);
+ list_delete(&pim_ifp->pim_neighbor_list);
+ list_delete(&pim_ifp->upstream_switch_list);
+ list_delete(&pim_ifp->sec_addr_list);
if (pim_ifp->boundary_oil_plist)
XFREE(MTYPE_PIM_INTERFACE, pim_ifp->boundary_oil_plist);
@@ -1349,7 +1349,7 @@ int pim_if_igmp_join_del(struct interface *ifp, struct in_addr group_addr,
listnode_delete(pim_ifp->igmp_join_list, ij);
igmp_join_free(ij);
if (listcount(pim_ifp->igmp_join_list) < 1) {
- list_delete_and_null(&pim_ifp->igmp_join_list);
+ list_delete(&pim_ifp->igmp_join_list);
pim_ifp->igmp_join_list = 0;
}
diff --git a/pimd/pim_ifchannel.c b/pimd/pim_ifchannel.c
index a3d6a2e658..129d569c87 100644
--- a/pimd/pim_ifchannel.c
+++ b/pimd/pim_ifchannel.c
@@ -162,7 +162,7 @@ void pim_ifchannel_delete(struct pim_ifchannel *ch)
pim_ifchannel_remove_children(ch);
if (ch->sources)
- list_delete_and_null(&ch->sources);
+ list_delete(&ch->sources);
listnode_delete(ch->upstream->ifchannels, ch);
diff --git a/pimd/pim_igmp.c b/pimd/pim_igmp.c
index 64537cfa84..8a2efd41ad 100644
--- a/pimd/pim_igmp.c
+++ b/pimd/pim_igmp.c
@@ -736,7 +736,7 @@ void igmp_startup_mode_on(struct igmp_sock *igmp)
static void igmp_group_free(struct igmp_group *group)
{
- list_delete_and_null(&group->group_source_list);
+ list_delete(&group->group_source_list);
XFREE(MTYPE_PIM_IGMP_GROUP, group);
}
@@ -788,7 +788,7 @@ void igmp_sock_free(struct igmp_sock *igmp)
zassert(igmp->igmp_group_list);
zassert(!listcount(igmp->igmp_group_list));
- list_delete_and_null(&igmp->igmp_group_list);
+ list_delete(&igmp->igmp_group_list);
hash_free(igmp->igmp_group_hash);
XFREE(MTYPE_PIM_IGMP_SOCKET, igmp);
diff --git a/pimd/pim_instance.c b/pimd/pim_instance.c
index c592a2c047..2550651464 100644
--- a/pimd/pim_instance.c
+++ b/pimd/pim_instance.c
@@ -42,7 +42,7 @@ static void pim_instance_terminate(struct pim_instance *pim)
}
if (pim->static_routes)
- list_delete_and_null(&pim->static_routes);
+ list_delete(&pim->static_routes);
pim_upstream_terminate(pim);
diff --git a/pimd/pim_jp_agg.c b/pimd/pim_jp_agg.c
index c5f5b9c5e0..7726ffda57 100644
--- a/pimd/pim_jp_agg.c
+++ b/pimd/pim_jp_agg.c
@@ -32,7 +32,7 @@
void pim_jp_agg_group_list_free(struct pim_jp_agg_group *jag)
{
- list_delete_and_null(&jag->sources);
+ list_delete(&jag->sources);
XFREE(MTYPE_PIM_JP_AGG_GROUP, jag);
}
@@ -108,7 +108,7 @@ void pim_jp_agg_clear_group(struct list *group)
js->up = NULL;
XFREE(MTYPE_PIM_JP_AGG_SOURCE, js);
}
- list_delete_and_null(&jag->sources);
+ list_delete(&jag->sources);
listnode_delete(group, jag);
XFREE(MTYPE_PIM_JP_AGG_GROUP, jag);
}
@@ -168,7 +168,7 @@ void pim_jp_agg_remove_group(struct list *group, struct pim_upstream *up)
}
if (jag->sources->count == 0) {
- list_delete_and_null(&jag->sources);
+ list_delete(&jag->sources);
listnode_delete(group, jag);
XFREE(MTYPE_PIM_JP_AGG_GROUP, jag);
}
diff --git a/pimd/pim_msdp.c b/pimd/pim_msdp.c
index 5a75ed329c..9ef343a0c5 100644
--- a/pimd/pim_msdp.c
+++ b/pimd/pim_msdp.c
@@ -1260,7 +1260,7 @@ static void pim_msdp_mg_free(struct pim_instance *pim)
XFREE(MTYPE_PIM_MSDP_MG_NAME, mg->mesh_group_name);
if (mg->mbr_list)
- list_delete_and_null(&mg->mbr_list);
+ list_delete(&mg->mbr_list);
XFREE(MTYPE_PIM_MSDP_MG, pim->msdp.mg);
}
@@ -1610,7 +1610,7 @@ void pim_msdp_exit(struct pim_instance *pim)
}
if (pim->msdp.peer_list) {
- list_delete_and_null(&pim->msdp.peer_list);
+ list_delete(&pim->msdp.peer_list);
}
if (pim->msdp.sa_hash) {
@@ -1620,7 +1620,7 @@ void pim_msdp_exit(struct pim_instance *pim)
}
if (pim->msdp.sa_list) {
- list_delete_and_null(&pim->msdp.sa_list);
+ list_delete(&pim->msdp.sa_list);
}
if (pim->msdp.work_obuf)
diff --git a/pimd/pim_neighbor.c b/pimd/pim_neighbor.c
index bff1e7ff13..f402629653 100644
--- a/pimd/pim_neighbor.c
+++ b/pimd/pim_neighbor.c
@@ -397,7 +397,7 @@ static void delete_prefix_list(struct pim_neighbor *neigh)
}
#endif
- list_delete_and_null(&neigh->prefix_list);
+ list_delete(&neigh->prefix_list);
}
}
@@ -407,7 +407,7 @@ void pim_neighbor_free(struct pim_neighbor *neigh)
delete_prefix_list(neigh);
- list_delete_and_null(&neigh->upstream_jp_agg);
+ list_delete(&neigh->upstream_jp_agg);
THREAD_OFF(neigh->jp_timer);
if (neigh->bfd_info)
diff --git a/pimd/pim_nht.c b/pimd/pim_nht.c
index 0a64c8db3d..2d808639b5 100644
--- a/pimd/pim_nht.c
+++ b/pimd/pim_nht.c
@@ -196,7 +196,7 @@ void pim_delete_tracked_nexthop(struct pim_instance *pim, struct prefix *addr,
pim_sendmsg_zebra_rnh(pim, zclient, pnc,
ZEBRA_NEXTHOP_UNREGISTER);
- list_delete_and_null(&pnc->rp_list);
+ list_delete(&pnc->rp_list);
hash_free(pnc->upstream_hash);
hash_release(pim->rpf_hash, pnc);
diff --git a/pimd/pim_oil.c b/pimd/pim_oil.c
index a0debc0c78..68f7dae128 100644
--- a/pimd/pim_oil.c
+++ b/pimd/pim_oil.c
@@ -116,7 +116,7 @@ void pim_oil_init(struct pim_instance *pim)
void pim_oil_terminate(struct pim_instance *pim)
{
if (pim->channel_oil_list)
- list_delete_and_null(&pim->channel_oil_list);
+ list_delete(&pim->channel_oil_list);
if (pim->channel_oil_hash)
hash_free(pim->channel_oil_hash);
diff --git a/pimd/pim_rp.c b/pimd/pim_rp.c
index 51ca0945b9..6b76794b75 100644
--- a/pimd/pim_rp.c
+++ b/pimd/pim_rp.c
@@ -52,7 +52,7 @@ void pim_rp_list_hash_clean(void *data)
{
struct pim_nexthop_cache *pnc = (struct pim_nexthop_cache *)data;
- list_delete_and_null(&pnc->rp_list);
+ list_delete(&pnc->rp_list);
hash_clean(pnc->upstream_hash, NULL);
hash_free(pnc->upstream_hash);
@@ -115,7 +115,7 @@ void pim_rp_init(struct pim_instance *pim)
if (!str2prefix("224.0.0.0/4", &rp_info->group)) {
flog_err(EC_LIB_DEVELOPMENT,
"Unable to convert 224.0.0.0/4 to prefix");
- list_delete_and_null(&pim->rp_list);
+ list_delete(&pim->rp_list);
route_table_finish(pim->rp_table);
XFREE(MTYPE_PIM_RP, rp_info);
return;
@@ -138,7 +138,7 @@ void pim_rp_init(struct pim_instance *pim)
void pim_rp_free(struct pim_instance *pim)
{
if (pim->rp_list)
- list_delete_and_null(&pim->rp_list);
+ list_delete(&pim->rp_list);
}
/*
diff --git a/pimd/pim_ssmpingd.c b/pimd/pim_ssmpingd.c
index a5082608b8..c3d958428c 100644
--- a/pimd/pim_ssmpingd.c
+++ b/pimd/pim_ssmpingd.c
@@ -52,7 +52,7 @@ void pim_ssmpingd_init(struct pim_instance *pim)
void pim_ssmpingd_destroy(struct pim_instance *pim)
{
if (pim->ssmpingd_list)
- list_delete_and_null(&pim->ssmpingd_list);
+ list_delete(&pim->ssmpingd_list);
}
static struct ssmpingd_sock *ssmpingd_find(struct pim_instance *pim,
diff --git a/pimd/pim_tlv.c b/pimd/pim_tlv.c
index 70700dd508..d93a360448 100644
--- a/pimd/pim_tlv.c
+++ b/pimd/pim_tlv.c
@@ -657,7 +657,7 @@ int pim_parse_addr_source(struct prefix_sg *sg, uint8_t *flags,
#define FREE_ADDR_LIST(hello_option_addr_list) \
{ \
if (hello_option_addr_list) { \
- list_delete_and_null(&hello_option_addr_list); \
+ list_delete(&hello_option_addr_list); \
hello_option_addr_list = 0; \
} \
}
diff --git a/pimd/pim_upstream.c b/pimd/pim_upstream.c
index 4adfde6775..cd6326f097 100644
--- a/pimd/pim_upstream.c
+++ b/pimd/pim_upstream.c
@@ -80,7 +80,7 @@ static void pim_upstream_remove_children(struct pim_instance *pim,
if (child)
child->parent = NULL;
}
- list_delete_and_null(&up->sources);
+ list_delete(&up->sources);
}
/*
@@ -202,11 +202,11 @@ struct pim_upstream *pim_upstream_del(struct pim_instance *pim,
for (ALL_LIST_ELEMENTS(up->ifchannels, node, nnode, ch))
pim_ifchannel_delete(ch);
- list_delete_and_null(&up->ifchannels);
+ list_delete(&up->ifchannels);
pim_upstream_remove_children(pim, up);
if (up->sources)
- list_delete_and_null(&up->sources);
+ list_delete(&up->sources);
if (up->parent && up->parent->sources)
listnode_delete(up->parent->sources, up);
@@ -683,9 +683,9 @@ static struct pim_upstream *pim_upstream_new(struct pim_instance *pim,
pim_upstream_remove_children(pim, up);
if (up->sources)
- list_delete_and_null(&up->sources);
+ list_delete(&up->sources);
- list_delete_and_null(&up->ifchannels);
+ list_delete(&up->ifchannels);
hash_release(pim->upstream_hash, up);
XFREE(MTYPE_PIM_UPSTREAM, up);
@@ -1542,7 +1542,7 @@ void pim_upstream_terminate(struct pim_instance *pim)
pim_upstream_del(pim, up, __PRETTY_FUNCTION__);
}
- list_delete_and_null(&pim->upstream_list);
+ list_delete(&pim->upstream_list);
}
if (pim->upstream_hash)
diff --git a/redhat/frr.spec.in b/redhat/frr.spec.in
index bff0b40515..1395af5dfb 100644
--- a/redhat/frr.spec.in
+++ b/redhat/frr.spec.in
@@ -216,7 +216,7 @@ Contributed/3rd party tools which may be of use with frr.
%package pythontools
Summary: python tools for frr
BuildRequires: python
-Requires: python-ipaddr
+Requires: python-ipaddress
Group: System Environment/Daemons
%description pythontools
diff --git a/ripd/rip_offset.c b/ripd/rip_offset.c
index ab14c3176d..d2065a4bbb 100644
--- a/ripd/rip_offset.c
+++ b/ripd/rip_offset.c
@@ -363,7 +363,7 @@ void rip_offset_init()
void rip_offset_clean()
{
- list_delete_and_null(&rip_offset_list_master);
+ list_delete(&rip_offset_list_master);
rip_offset_list_master = list_new();
rip_offset_list_master->cmp = (int (*)(void *, void *))offset_list_cmp;
diff --git a/ripd/ripd.c b/ripd/ripd.c
index 94c3d4bc9c..444a09914c 100644
--- a/ripd/ripd.c
+++ b/ripd/ripd.c
@@ -131,7 +131,7 @@ static int rip_garbage_collect(struct thread *t)
/* Unlock route_node. */
listnode_delete(rp->info, rinfo);
if (list_isempty((struct list *)rp->info)) {
- list_delete_and_null((struct list **)&rp->info);
+ list_delete((struct list **)&rp->info);
route_unlock_node(rp);
}
@@ -3832,7 +3832,7 @@ void rip_clean(void)
RIP_TIMER_OFF(rinfo->t_garbage_collect);
rip_info_free(rinfo);
}
- list_delete_and_null(&list);
+ list_delete(&list);
rp->info = NULL;
route_unlock_node(rp);
}
diff --git a/ripngd/ripng_nexthop.c b/ripngd/ripng_nexthop.c
index 2e0841c5d4..74a132aa94 100644
--- a/ripngd/ripng_nexthop.c
+++ b/ripngd/ripng_nexthop.c
@@ -72,7 +72,7 @@ struct list *ripng_rte_new(void)
void ripng_rte_free(struct list *ripng_rte_list)
{
- list_delete_and_null(&ripng_rte_list);
+ list_delete(&ripng_rte_list);
}
/* Delete RTE */
diff --git a/ripngd/ripng_offset.c b/ripngd/ripng_offset.c
index f8d73250b4..32b81b5480 100644
--- a/ripngd/ripng_offset.c
+++ b/ripngd/ripng_offset.c
@@ -375,7 +375,7 @@ void ripng_offset_init(void)
void ripng_offset_clean(void)
{
- list_delete_and_null(&ripng_offset_list_master);
+ list_delete(&ripng_offset_list_master);
ripng_offset_list_master = list_new();
ripng_offset_list_master->cmp =
diff --git a/ripngd/ripngd.c b/ripngd/ripngd.c
index fbc06b0348..08dc3d8b4d 100644
--- a/ripngd/ripngd.c
+++ b/ripngd/ripngd.c
@@ -407,7 +407,7 @@ static int ripng_garbage_collect(struct thread *t)
/* Unlock route_node. */
listnode_delete(rp->info, rinfo);
if (list_isempty((struct list *)rp->info)) {
- list_delete_and_null((struct list **)&rp->info);
+ list_delete((struct list **)&rp->info);
agg_unlock_node(rp);
}
@@ -2144,7 +2144,7 @@ DEFUN (clear_ipv6_rip,
}
if (list_isempty(list)) {
- list_delete_and_null(&list);
+ list_delete(&list);
rp->info = NULL;
agg_unlock_node(rp);
}
@@ -2826,7 +2826,7 @@ void ripng_clean()
rinfo->t_garbage_collect);
ripng_info_free(rinfo);
}
- list_delete_and_null(&list);
+ list_delete(&list);
rp->info = NULL;
agg_unlock_node(rp);
}
diff --git a/tests/bgpd/test_bgp_table.c b/tests/bgpd/test_bgp_table.c
index a0382827b9..171b1aa22f 100644
--- a/tests/bgpd/test_bgp_table.c
+++ b/tests/bgpd/test_bgp_table.c
@@ -134,7 +134,7 @@ static void do_test(struct bgp_table *table, const char *prefix,
check_lookup_result(list, arglist);
- list_delete_and_null(&list);
+ list_delete(&list);
va_end(arglist);
diff --git a/tests/bgpd/test_peer_attr.c b/tests/bgpd/test_peer_attr.c
index e40fba2457..8e81119f5d 100644
--- a/tests/bgpd/test_peer_attr.c
+++ b/tests/bgpd/test_peer_attr.c
@@ -966,7 +966,7 @@ static void test_finish(struct test *test)
test->vty = NULL;
}
if (test->log)
- list_delete_and_null(&test->log);
+ list_delete(&test->log);
if (test->desc)
XFREE(MTYPE_TMP, test->desc);
if (test->error)
@@ -1423,7 +1423,7 @@ static void bgp_shutdown(void)
bgp_zebra_destroy();
bf_free(bm->rd_idspace);
- list_delete_and_null(&bm->bgp);
+ list_delete(&bm->bgp);
memset(bm, 0, sizeof(*bm));
vty_terminate();
@@ -1502,7 +1502,7 @@ int main(void)
XFREE(MTYPE_TMP, pa);
}
- list_delete_and_null(&pa_list);
+ list_delete(&pa_list);
bgp_shutdown();
return 0;
diff --git a/tests/isisd/test_fuzz_isis_tlv.c b/tests/isisd/test_fuzz_isis_tlv.c
index b75c1002d4..917ea66f13 100644
--- a/tests/isisd/test_fuzz_isis_tlv.c
+++ b/tests/isisd/test_fuzz_isis_tlv.c
@@ -176,7 +176,7 @@ static int test(FILE *input, FILE *output)
sbuf_push(&fragment_format, 0, "%s", isis_format_tlvs(tlvs));
isis_free_tlvs(tlvs);
}
- list_delete_and_null(&fragments);
+ list_delete(&fragments);
stream_free(s);
char *fragment_content = sortlines((char *)sbuf_buf(&fragment_format));
diff --git a/tools/.gitignore b/tools/.gitignore
index d400dfe8fa..a8d01d680e 100644
--- a/tools/.gitignore
+++ b/tools/.gitignore
@@ -1,2 +1,3 @@
+/frr
/permutations
/ssd
diff --git a/tools/frr-reload.py b/tools/frr-reload.py
index 9d1af27d6c..3b41b57d68 100755
--- a/tools/frr-reload.py
+++ b/tools/frr-reload.py
@@ -28,6 +28,7 @@ This program
text file
"""
+from __future__ import print_function, unicode_literals
import argparse
import copy
import logging
@@ -38,9 +39,22 @@ import string
import subprocess
import sys
from collections import OrderedDict
-from ipaddr import IPv6Address, IPNetwork
+try:
+ from ipaddress import IPv6Address, ip_network
+except ImportError:
+ from ipaddr import IPv6Address, IPNetwork
from pprint import pformat
+try:
+ dict.iteritems
+except AttributeError:
+ # Python 3
+ def iteritems(d):
+ return iter(d.items())
+else:
+ # Python 2
+ def iteritems(d):
+ return d.iteritems()
log = logging.getLogger(__name__)
@@ -116,7 +130,7 @@ class Config(object):
ve.output = e.output
raise ve
- for line in file_output.split('\n'):
+ for line in file_output.decode('utf-8').split('\n'):
line = line.strip()
# Compress duplicate whitespaces
@@ -147,7 +161,7 @@ class Config(object):
ve.output = e.output
raise ve
- for line in config_text.split('\n'):
+ for line in config_text.decode('utf-8').split('\n'):
line = line.strip()
if (line == 'Building configuration...' or
@@ -171,8 +185,8 @@ class Config(object):
Return the parsed context as strings for display, log etc.
"""
- for (_, ctx) in sorted(self.contexts.iteritems()):
- print str(ctx) + '\n'
+ for (_, ctx) in sorted(iteritems(self.contexts)):
+ print(str(ctx) + '\n')
def save_contexts(self, key, lines):
"""
@@ -195,11 +209,18 @@ class Config(object):
addr = re_key_rt.group(2)
if '/' in addr:
try:
- newaddr = IPNetwork(addr)
- key[0] = '%s route %s/%s%s' % (re_key_rt.group(1),
- newaddr.network,
- newaddr.prefixlen,
- re_key_rt.group(3))
+ if 'ipaddress' not in sys.modules:
+ newaddr = IPNetwork(addr)
+ key[0] = '%s route %s/%s%s' % (re_key_rt.group(1),
+ newaddr.network,
+ newaddr.prefixlen,
+ re_key_rt.group(3))
+ else:
+ newaddr = ip_network(addr, strict=False)
+ key[0] = '%s route %s/%s%s' % (re_key_rt.group(1),
+ str(newaddr.network_address),
+ newaddr.prefixlen,
+ re_key_rt.group(3))
except ValueError:
pass
@@ -211,8 +232,13 @@ class Config(object):
addr = re_key_rt.group(4)
if '/' in addr:
try:
- newaddr = '%s/%s' % (IPNetwork(addr).network,
- IPNetwork(addr).prefixlen)
+ if 'ipaddress' not in sys.modules:
+ newaddr = '%s/%s' % (IPNetwork(addr).network,
+ IPNetwork(addr).prefixlen)
+ else:
+ network_addr = ip_network(addr, strict=False)
+ newaddr = '%s/%s' % (str(network_addr.network_address),
+ network_addr.prefixlen)
except ValueError:
newaddr = addr
else:
@@ -253,10 +279,16 @@ class Config(object):
addr = addr + '/8'
try:
- newaddr = IPNetwork(addr)
- line = 'network %s/%s %s' % (newaddr.network,
- newaddr.prefixlen,
- re_net.group(2))
+ if 'ipaddress' not in sys.modules:
+ newaddr = IPNetwork(addr)
+ line = 'network %s/%s %s' % (newaddr.network,
+ newaddr.prefixlen,
+ re_net.group(2))
+ else:
+ network_addr = ip_network(addr, strict=False)
+ line = 'network %s/%s %s' % (str(network_addr.network_address),
+ network_addr.prefixlen,
+ re_net.group(2))
newlines.append(line)
except ValueError:
# Really this should be an error. Whats a network
@@ -598,8 +630,12 @@ def get_normalized_ipv6_line(line):
norm_word = None
if "/" in word:
try:
- v6word = IPNetwork(word)
- norm_word = '%s/%s' % (v6word.network, v6word.prefixlen)
+ if 'ipaddress' not in sys.modules:
+ v6word = IPNetwork(word)
+ norm_word = '%s/%s' % (v6word.network, v6word.prefixlen)
+ else:
+ v6word = ip_network(word, strict=False)
+ norm_word = '%s/%s' % (str(v6word.network_address), v6word.prefixlen)
except ValueError:
pass
if not norm_word:
@@ -926,7 +962,7 @@ def compare_context_objects(newconf, running):
# Find contexts that are in newconf but not in running
# Find contexts that are in running but not in newconf
- for (running_ctx_keys, running_ctx) in running.contexts.iteritems():
+ for (running_ctx_keys, running_ctx) in iteritems(running.contexts):
if running_ctx_keys not in newconf.contexts:
@@ -977,7 +1013,7 @@ def compare_context_objects(newconf, running):
# Find the lines within each context to add
# Find the lines within each context to del
- for (newconf_ctx_keys, newconf_ctx) in newconf.contexts.iteritems():
+ for (newconf_ctx_keys, newconf_ctx) in iteritems(newconf.contexts):
if newconf_ctx_keys in running.contexts:
running_ctx = running.contexts[newconf_ctx_keys]
@@ -990,7 +1026,7 @@ def compare_context_objects(newconf, running):
if line not in newconf_ctx.dlines:
lines_to_del.append((newconf_ctx_keys, line))
- for (newconf_ctx_keys, newconf_ctx) in newconf.contexts.iteritems():
+ for (newconf_ctx_keys, newconf_ctx) in iteritems(newconf.contexts):
if newconf_ctx_keys not in running.contexts:
lines_to_add.append((newconf_ctx_keys, None))
@@ -1016,14 +1052,14 @@ def vtysh_config_available():
cmd = ['/usr/bin/vtysh', '-c', 'conf t']
output = subprocess.check_output(cmd, stderr=subprocess.STDOUT).strip()
- if 'VTY configuration is locked by other VTY' in output:
- print output
+ if 'VTY configuration is locked by other VTY' in output.decode('utf-8'):
+ print(output)
log.error("'%s' returned\n%s\n" % (' '.join(cmd), output))
return False
except subprocess.CalledProcessError as e:
msg = "vtysh could not connect with any frr daemons"
- print msg
+ print(msg)
log.error(msg)
return False
@@ -1070,13 +1106,13 @@ if __name__ == '__main__':
# Verify the new config file is valid
if not os.path.isfile(args.filename):
msg = "Filename %s does not exist" % args.filename
- print msg
+ print(msg)
log.error(msg)
sys.exit(1)
if not os.path.getsize(args.filename):
msg = "Filename %s is an empty file" % args.filename
- print msg
+ print(msg)
log.error(msg)
sys.exit(1)
@@ -1095,7 +1131,7 @@ if __name__ == '__main__':
if not service_integrated_vtysh_config:
msg = "'service integrated-vtysh-config' is not configured, this is required for 'service frr reload'"
- print msg
+ print(msg)
log.error(msg)
sys.exit(1)
@@ -1123,8 +1159,8 @@ if __name__ == '__main__':
lines_to_configure = []
if lines_to_del:
- print "\nLines To Delete"
- print "==============="
+ print("\nLines To Delete")
+ print("===============")
for (ctx_keys, line) in lines_to_del:
@@ -1133,11 +1169,11 @@ if __name__ == '__main__':
cmd = line_for_vtysh_file(ctx_keys, line, True)
lines_to_configure.append(cmd)
- print cmd
+ print(cmd)
if lines_to_add:
- print "\nLines To Add"
- print "============"
+ print("\nLines To Add")
+ print("============")
for (ctx_keys, line) in lines_to_add:
@@ -1146,7 +1182,7 @@ if __name__ == '__main__':
cmd = line_for_vtysh_file(ctx_keys, line, False)
lines_to_configure.append(cmd)
- print cmd
+ print(cmd)
elif args.reload:
diff --git a/tools/lua.scr b/tools/lua.scr
new file mode 100644
index 0000000000..db6bf7d36b
--- /dev/null
+++ b/tools/lua.scr
@@ -0,0 +1,29 @@
+-- Route map functionality
+--
+-- There are no parameters passed in.
+-- Currently we set two global tables
+-- prefix
+-- .family = The v4 or v6 family we are working in
+-- .route = the A.B.C.D/X or Z:A:B::D/X string
+-- nexthop
+-- .metric = The metric we are going to use
+-- .ifindex = The outgoing interface
+-- .aspath = The aspath of the route
+-- .localpref = The localpref value
+--
+-- Valid Return Codes:
+-- 0 - Some sort of processing failure
+-- This turns into a implicit DENY
+-- 1 - No match was found, turns into a DENY
+-- 2 - Match found, turns into a PERMIT
+-- 3 - Match found and data structures changed, turns into a PERMIT
+-- and a reread of the prefix and nexthop tables
+function mooey ()
+ zlog_debug(string.format("Family: %d: %s %d ifindex: %d aspath: %s localpref: %d",
+ prefix.family, prefix.route,
+ nexthop.metric, nexthop.ifindex, nexthop.aspath, nexthop.localpref))
+
+ nexthop.metric = 33
+ nexthop.localpref = 13
+ return 3
+end
diff --git a/vtysh/vtysh_config.c b/vtysh/vtysh_config.c
index 9f6e20f2be..7a55da462d 100644
--- a/vtysh/vtysh_config.c
+++ b/vtysh/vtysh_config.c
@@ -73,7 +73,7 @@ static int config_cmp(struct config *c1, struct config *c2)
static void config_del(struct config *config)
{
- list_delete_and_null(&config->line);
+ list_delete(&config->line);
if (config->name)
XFREE(MTYPE_VTYSH_CONFIG_LINE, config->name);
XFREE(MTYPE_VTYSH_CONFIG, config);
@@ -393,7 +393,7 @@ void vtysh_config_dump(void)
for (i = 0; i < vector_active(configvec); i++)
if ((master = vector_slot(configvec, i)) != NULL) {
- list_delete_and_null(&master);
+ list_delete(&master);
vector_slot(configvec, i) = NULL;
}
list_delete_all_node(config_top);
diff --git a/zebra/interface.c b/zebra/interface.c
index 96b244635d..afb08f7012 100644
--- a/zebra/interface.c
+++ b/zebra/interface.c
@@ -88,7 +88,7 @@ static void zebra_if_node_destroy(route_table_delegate_t *delegate,
struct route_node *node)
{
if (node->info)
- list_delete_and_null((struct list **)&node->info);
+ list_delete((struct list **)&node->info);
route_node_destroy(delegate, table, node);
}
@@ -174,7 +174,7 @@ static int if_zebra_delete_hook(struct interface *ifp)
struct rtadvconf *rtadv;
rtadv = &zebra_if->rtadv;
- list_delete_and_null(&rtadv->AdvPrefixList);
+ list_delete(&rtadv->AdvPrefixList);
#endif /* HAVE_RTADV */
THREAD_OFF(zebra_if->speed_update);
@@ -361,7 +361,7 @@ int if_subnet_delete(struct interface *ifp, struct connected *ifc)
}
/* Otherwise, free list and route node. */
- list_delete_and_null(&addr_list);
+ list_delete(&addr_list);
rn->info = NULL;
route_unlock_node(rn);
@@ -673,7 +673,7 @@ static void if_delete_connected(struct interface *ifp)
}
/* Free chain list and respective route node. */
- list_delete_and_null(&addr_list);
+ list_delete(&addr_list);
rn->info = NULL;
route_unlock_node(rn);
} else if (cp.family == AF_INET6) {
diff --git a/zebra/irdp_interface.c b/zebra/irdp_interface.c
index 5fdaae4fe5..3e50550dd2 100644
--- a/zebra/irdp_interface.c
+++ b/zebra/irdp_interface.c
@@ -309,7 +309,7 @@ static void irdp_if_stop(struct interface *ifp)
irdp_advert_off(ifp);
- list_delete_and_null(&irdp->AdvPrefList);
+ list_delete(&irdp->AdvPrefList);
irdp->flags = 0;
}
diff --git a/zebra/label_manager.c b/zebra/label_manager.c
index 2b0508099f..8afb1a0b79 100644
--- a/zebra/label_manager.c
+++ b/zebra/label_manager.c
@@ -482,6 +482,6 @@ int release_label_chunk(uint8_t proto, unsigned short instance, uint32_t start,
void label_manager_close()
{
- list_delete_and_null(&lbl_mgr.lc_list);
+ list_delete(&lbl_mgr.lc_list);
stream_free(obuf);
}
diff --git a/zebra/main.c b/zebra/main.c
index c46f8bb95d..148bcab7e4 100644
--- a/zebra/main.c
+++ b/zebra/main.c
@@ -170,7 +170,7 @@ static void sigint(void)
prefix_list_reset();
route_map_finish();
- list_delete_and_null(&zebrad.client_list);
+ list_delete(&zebrad.client_list);
work_queue_free_and_null(&zebrad.ribq);
meta_queue_free(zebrad.mq);
diff --git a/zebra/table_manager.c b/zebra/table_manager.c
index 91b45f3f07..7ed673a88f 100644
--- a/zebra/table_manager.c
+++ b/zebra/table_manager.c
@@ -237,5 +237,5 @@ void table_manager_disable(ns_id_t ns_id)
{
if (ns_id != NS_DEFAULT)
return;
- list_delete_and_null(&tbl_mgr.lc_list);
+ list_delete(&tbl_mgr.lc_list);
}
diff --git a/zebra/zebra_mpls.c b/zebra/zebra_mpls.c
index 0d1ccdc5aa..0ccd3242d5 100644
--- a/zebra/zebra_mpls.c
+++ b/zebra/zebra_mpls.c
@@ -572,7 +572,7 @@ static zebra_fec_t *fec_add(struct route_table *table, struct prefix *p,
*/
static int fec_del(zebra_fec_t *fec)
{
- list_delete_and_null(&fec->client_list);
+ list_delete(&fec->client_list);
fec->rn->info = NULL;
route_unlock_node(fec->rn);
XFREE(MTYPE_FEC, fec);
@@ -2810,7 +2810,7 @@ void zebra_mpls_print_lsp_table(struct vty *vty, struct zebra_vrf *zvrf,
vty_out(vty, "\n");
}
- list_delete_and_null(&lsp_list);
+ list_delete(&lsp_list);
}
/*
@@ -2849,7 +2849,7 @@ int zebra_mpls_write_lsp_config(struct vty *vty, struct zebra_vrf *zvrf)
}
}
- list_delete_and_null(&slsp_list);
+ list_delete(&slsp_list);
return (zvrf->slsp_table->count ? 1 : 0);
}
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c
index a8f3493547..bdcf03a055 100644
--- a/zebra/zebra_rib.c
+++ b/zebra/zebra_rib.c
@@ -2058,7 +2058,7 @@ void meta_queue_free(struct meta_queue *mq)
unsigned i;
for (i = 0; i < MQ_SIZE; i++)
- list_delete_and_null(&mq->subq[i]);
+ list_delete(&mq->subq[i]);
XFREE(MTYPE_WORK_QUEUE, mq);
}
diff --git a/zebra/zebra_rnh.c b/zebra/zebra_rnh.c
index 30062a0728..622ed5ac05 100644
--- a/zebra/zebra_rnh.c
+++ b/zebra/zebra_rnh.c
@@ -171,8 +171,8 @@ struct rnh *zebra_lookup_rnh(struct prefix *p, vrf_id_t vrfid, rnh_type_t type)
void zebra_free_rnh(struct rnh *rnh)
{
rnh->flags |= ZEBRA_NHT_DELETED;
- list_delete_and_null(&rnh->client_list);
- list_delete_and_null(&rnh->zebra_pseudowire_list);
+ list_delete(&rnh->client_list);
+ list_delete(&rnh->zebra_pseudowire_list);
free_state(rnh->vrf_id, rnh->state, rnh->node);
XFREE(MTYPE_RNH, rnh);
}
diff --git a/zebra/zebra_vxlan.c b/zebra/zebra_vxlan.c
index 989d63f9b1..f8417503ef 100644
--- a/zebra/zebra_vxlan.c
+++ b/zebra/zebra_vxlan.c
@@ -2287,7 +2287,7 @@ static int zvni_mac_del(zebra_vni_t *zvni, zebra_mac_t *mac)
{
zebra_mac_t *tmp_mac;
- list_delete_and_null(&mac->neigh_list);
+ list_delete(&mac->neigh_list);
/* Free the VNI hash entry and allocated memory. */
tmp_mac = hash_release(zvni->mac_table, mac);
@@ -3663,7 +3663,7 @@ static int zl3vni_del(zebra_l3vni_t *zl3vni)
assert(zns);
/* free the list of l2vnis */
- list_delete_and_null(&zl3vni->l2vnis);
+ list_delete(&zl3vni->l2vnis);
zl3vni->l2vnis = NULL;
/* Free the rmac table */