summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am2
-rw-r--r--bgpd/bgp_errors.c6
-rw-r--r--bgpd/bgp_errors.h1
-rw-r--r--bgpd/bgp_evpn.c16
-rw-r--r--bgpd/bgp_evpn_vty.c2
-rw-r--r--bgpd/bgp_flowspec_vty.c2
-rw-r--r--bgpd/bgp_fsm.c14
-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.c32
-rw-r--r--bgpd/bgp_routemap.c94
-rw-r--r--bgpd/bgp_rpki.c4
-rw-r--r--bgpd/bgp_zebra.c2
-rw-r--r--bgpd/bgpd.c32
-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.ac25
-rw-r--r--doc/developer/packaging-debian.rst7
-rw-r--r--doc/user/bgp.rst249
-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/nexthop_group.c2
-rw-r--r--lib/routemap.c139
-rw-r--r--lib/routemap.h16
-rw-r--r--lib/subdir.am17
-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.c5
-rw-r--r--ospf6d/ospf6_area.c2
-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_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.c6
-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_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--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
-rwxr-xr-xtools/build-debian-package.sh40
-rw-r--r--tools/subdir.am1
-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
122 files changed, 828 insertions, 413 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_errors.c b/bgpd/bgp_errors.c
index bd42901c2d..7cebd0e484 100644
--- a/bgpd/bgp_errors.c
+++ b/bgpd/bgp_errors.c
@@ -463,6 +463,12 @@ static struct log_ref ferr_bgp_err[] = {
.suggestion = "Gather log files from the router and open an issue, Restart FRR"
},
{
+ .code = EC_BGP_DOPPELGANGER_CONFIG,
+ .title = "BGP has detected a configuration overwrite during peer collision resolution",
+ .description = "As part of BGP startup, the peer and ourselves can start connections to each other at the same time. During this process BGP received additional configuration, but it was only applied to one of the two nascent connections. Depending on the result of collision detection and resolution this configuration might be lost. To remedy this, after performing collision detection and resolution the peer session has been reset in order to apply the new configuration.",
+ .suggestion = "Gather data and open a Issue so that this developmental escape can be fixed, the peer should have been reset",
+ },
+ {
.code = END_FERR,
}
};
diff --git a/bgpd/bgp_errors.h b/bgpd/bgp_errors.h
index 853f2da222..13bd318e27 100644
--- a/bgpd/bgp_errors.h
+++ b/bgpd/bgp_errors.h
@@ -99,6 +99,7 @@ enum bgp_log_refs {
EC_BGP_CAPABILITY_VENDOR,
EC_BGP_CAPABILITY_UNKNOWN,
EC_BGP_INVALID_NEXTHOP_LENGTH,
+ EC_BGP_DOPPELGANGER_CONFIG,
};
extern void bgp_error_init(void);
diff --git a/bgpd/bgp_evpn.c b/bgpd/bgp_evpn.c
index 8002ebe1c7..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);
}
@@ -4988,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);
@@ -5062,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);
@@ -5631,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_fsm.c b/bgpd/bgp_fsm.c
index 384d2bca82..65b8b5bd2d 100644
--- a/bgpd/bgp_fsm.c
+++ b/bgpd/bgp_fsm.c
@@ -125,6 +125,20 @@ static struct peer *peer_xfer_conn(struct peer *from_peer)
if (!peer || !CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE))
return from_peer;
+ /*
+ * Let's check that we are not going to loose known configuration
+ * state based upon doppelganger rules.
+ */
+ FOREACH_AFI_SAFI (afi, safi) {
+ if (from_peer->afc[afi][safi] != peer->afc[afi][safi]) {
+ flog_err(
+ EC_BGP_DOPPELGANGER_CONFIG,
+ "from_peer->afc[%d][%d] is not the same as what we are overwriting",
+ afi, safi);
+ return NULL;
+ }
+ }
+
if (bgp_debug_neighbor_events(peer))
zlog_debug("%s: peer transfer %p fd %d -> %p fd %d)",
from_peer->host, from_peer, from_peer->fd, peer,
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 c508758204..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));
}
diff --git a/bgpd/bgp_routemap.c b/bgpd/bgp_routemap.c
index 8e7c0a69dd..0a3e4b3c89 100644
--- a/bgpd/bgp_routemap.c
+++ b/bgpd/bgp_routemap.c
@@ -645,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
@@ -2469,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. */
@@ -4766,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);
@@ -4800,6 +4892,7 @@ void bgp_route_map_init(void)
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);
@@ -4915,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);
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..0300485e91 100644
--- a/bgpd/bgpd.c
+++ b/bgpd/bgpd.c
@@ -1802,6 +1802,7 @@ static void peer_group2peer_config_copy_af(struct peer_group *group,
static int peer_activate_af(struct peer *peer, afi_t afi, safi_t safi)
{
int active;
+ struct peer *other;
if (CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
flog_err(EC_BGP_PEER_GROUP, "%s was called for peer-group %s",
@@ -1852,6 +1853,23 @@ static int peer_activate_af(struct peer *peer, afi_t afi, safi_t safi)
bgp_notify_send(peer, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
}
+ /*
+ * If we are turning on a AFI/SAFI locally and we've
+ * started bringing a peer up, we need to tell
+ * the other peer to restart because we might loose
+ * configuration here because when the doppelganger
+ * gets to a established state due to how
+ * we resolve we could just overwrite the afi/safi
+ * activation.
+ */
+ other = peer->doppelganger;
+ if (other
+ && (other->status == OpenSent
+ || other->status == OpenConfirm)) {
+ other->last_reset = PEER_DOWN_AF_ACTIVATE;
+ bgp_notify_send(other, BGP_NOTIFY_CEASE,
+ BGP_NOTIFY_CEASE_CONFIG_CHANGE);
+ }
}
return 0;
@@ -2426,14 +2444,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 +3239,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 +3282,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 +7882,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 4d18c7997a..12100121d6 100755
--- a/configure.ac
+++ b/configure.ac
@@ -310,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
@@ -741,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 ------------------------------------
diff --git a/doc/developer/packaging-debian.rst b/doc/developer/packaging-debian.rst
index 66339b6d1f..4ea784c0fc 100644
--- a/doc/developer/packaging-debian.rst
+++ b/doc/developer/packaging-debian.rst
@@ -130,6 +130,13 @@ If all worked correctly, then you should end up with the Debian packages under
with the sources (``frr_*.orig.tar.gz``, ``frr_*.debian.tar.xz`` and
``frr_*.dsc``)
+The build procedure can also be executed automatically using the ``tools/build-debian-package.sh``
+script. For example:
+
+.. code-block:: shell
+
+ EXTRA_VERSION="-myversion" WANT_SNMP=1 WANT_CUMULUS_MODE=1 tools/build-debian-package.sh
+
.. _deb-backports:
Debian Backports
diff --git a/doc/user/bgp.rst b/doc/user/bgp.rst
index d9d496f7fc..f10883b984 100644
--- a/doc/user/bgp.rst
+++ b/doc/user/bgp.rst
@@ -181,20 +181,6 @@ will establish the connection with unicast only capability. When there are no
common capabilities, FRR sends Unsupported Capability error and then resets the
connection.
-.. _bgp-concepts-vrfs:
-
-VRFs: Virtual Routing and Forwarding
-------------------------------------
-
-*bgpd* supports :abbr:`L3VPN (Layer 3 Virtual Private Networks)` :abbr:`VRFs
-(Virtual Routing and Forwarding tables)` for IPv4 :rfc:`4364` and IPv6
-:rfc:`4659`. L3VPN routes, and their associated VRF MPLS labels, can be
-distributed to VPN SAFI neighbors in the *default*, i.e., non VRF, BGP
-instance. VRF MPLS labels are reached using *core* MPLS labels which are
-distributed using LDP or BGP labeled unicast. *bgpd* also supports inter-VRF
-route leaking. General information on FRR's VRF support can be found in
-:ref:`zebra-vrf`.
-
.. _bgp-router-configuration:
BGP Router Configuration
@@ -228,6 +214,126 @@ internal or external.
not enabled *bgpd* can't get interface information so `router-id` is set to
0.0.0.0. So please set router-id by hand.
+
+.. _bgp-multiple-autonomous-systems:
+
+Multiple Autonomous Systems
+---------------------------
+
+FRR's BGP implementation is capable of running multiple autonomous systems at
+once. Each configured AS corresponds to a :ref:`zebra-vrf`. In the past, to get
+the same functionality the network administrator had to run a new *bgpd*
+process; using VRFs allows multiple autonomous systems to be handled in a
+single process.
+
+When using multiple autonomous systems, all router config blocks after the
+first one must specify a VRF to be the target of BGP's route selection. This
+VRF must be unique within respect to all other VRFs being used for the same
+purpose, i.e. two different autonomous systems cannot use the same VRF.
+However, the same AS can be used with different VRFs.
+
+.. note::
+
+ The separated nature of VRFs makes it possible to peer a single *bgpd*
+ process to itself, on one machine. Note that this can be done fully within
+ BGP without a corresponding VRF in the kernel or Zebra, which enables some
+ practical use cases such as :ref:`route reflectors <bgp-route-reflector>`
+ and route servers.
+
+Configuration of additional autonomous systems, or of a router that targets a
+specific VRF, is accomplished with the following command:
+
+.. index:: router bgp ASN vrf VRFNAME
+.. clicmd:: router bgp ASN vrf VRFNAME
+
+ ``VRFNAME`` is matched against VRFs configured in the kernel. When ``vrf
+ VRFNAME`` is not specified, the BGP protocol process belongs to the default
+ VRF.
+
+An example configuration with multiple autonomous systems might look like this:
+
+.. code-block:: frr
+
+ router bgp 1
+ neighbor 10.0.0.1 remote-as 20
+ neighbor 10.0.0.2 remote-as 30
+ !
+ router bgp 2 vrf blue
+ neighbor 10.0.0.3 remote-as 40
+ neighbor 10.0.0.4 remote-as 50
+ !
+ router bgp 3 vrf red
+ neighbor 10.0.0.5 remote-as 60
+ neighbor 10.0.0.6 remote-as 70
+ ...
+
+In the past this feature done differently and the following commands were
+required to enable the functionality. They are now deprecated.
+
+.. deprecated:: 5.0
+ This command is deprecated and may be safely removed from the config.
+
+.. index:: bgp multiple-instance
+.. clicmd:: bgp multiple-instance
+
+ Enable BGP multiple instance feature. Because this is now the default
+ configuration this command will not be displayed in the running
+ configuration.
+
+.. deprecated:: 5.0
+ This command is deprecated and may be safely removed from the config.
+
+.. index:: no bgp multiple-instance
+.. clicmd:: no bgp multiple-instance
+
+ In previous versions of FRR, this command disabled the BGP multiple instance
+ feature. This functionality is automatically turned on when BGP multiple
+ instances or views exist so this command no longer does anything.
+
+.. seealso:: :ref:`bgp-vrf-route-leaking`
+.. seealso:: :ref:`zebra-vrf`
+
+
+.. _bgp-views:
+
+Views
+-----
+
+In addition to supporting multiple autonomous systems, FRR's BGP implementation
+also supports *views*.
+
+BGP views are almost the same as normal BGP processes, except that routes
+selected by BGP are not installed into the kernel routing table. Each BGP view
+provides an independent set of routing information which is only distributed
+via BGP. Multiple views can be supported, and BGP view information is always
+independent from other routing protocols and Zebra/kernel routes. BGP views use
+the core instance (i.e., default VRF) for communication with peers.
+
+.. index:: router bgp AS-NUMBER view NAME
+.. clicmd:: router bgp AS-NUMBER view NAME
+
+ Make a new BGP view. You can use an arbitrary word for the ``NAME``. Routes
+ selected by the view are not installed into the kernel routing table.
+
+ With this command, you can setup Route Server like below.
+
+ .. code-block:: frr
+
+ !
+ router bgp 1 view 1
+ neighbor 10.0.0.1 remote-as 2
+ neighbor 10.0.0.2 remote-as 3
+ !
+ router bgp 2 view 2
+ neighbor 10.0.0.3 remote-as 4
+ neighbor 10.0.0.4 remote-as 5
+
+.. index:: show [ip] bgp view NAME
+.. clicmd:: show [ip] bgp view NAME
+
+ Display the routing table of BGP view ``NAME``.
+
+
Route Selection
---------------
@@ -1609,32 +1715,23 @@ Large Communities in Route Map
overwriting other values. Multiple large-community values can be specified.
-.. _bgp-vrfs:
+.. _bgp-l3vpn-vrfs:
-VRFs
-----
+L3VPN VRFs
+----------
-BGP supports multiple VRF instances with the following command:
-
-.. index:: router bgp ASN vrf VRFNAME
-.. clicmd:: router bgp ASN vrf VRFNAME
+*bgpd* supports :abbr:`L3VPN (Layer 3 Virtual Private Networks)` :abbr:`VRFs
+(Virtual Routing and Forwarding)` for IPv4 :rfc:`4364` and IPv6 :rfc:`4659`.
+L3VPN routes, and their associated VRF MPLS labels, can be distributed to VPN
+SAFI neighbors in the *default*, i.e., non VRF, BGP instance. VRF MPLS labels
+are reached using *core* MPLS labels which are distributed using LDP or BGP
+labeled unicast. *bgpd* also supports inter-VRF route leaking.
-``VRFNAME`` is matched against VRFs configured in the kernel. When
-``vrf VRFNAME`` is not specified, the BGP protocol process belongs to the
-default VRF.
-With VRF, you can isolate networking information. Having BGP VRF allows you to
-have several BGP instances on the same system process. This solution solves
-scalabiliy issues where the network administrator had previously to run
-separately several BGP processes on each namespace. Now, not only BGP VRF
-solves this, but also this method applies to both kind of VRFs backend: default
-VRF from Linux kernel or network namespaces. Also, having separate BGP
-instances does not imply that the AS number has to be different. For internal
-purposes, it is possible to do iBGP peering from two differents network
-namespaces.
+.. _bgp-vrf-route-leaking:
VRF Route Leaking
-^^^^^^^^^^^^^^^^^
+-----------------
BGP routes may be leaked (i.e. copied) between a unicast VRF RIB and the VPN
SAFI RIB of the default VRF for use in MPLS-based L3VPNs. Unicast routes may
@@ -1648,7 +1745,7 @@ to a unicast VRF, whereas ``export`` refers to routes leaked from a unicast VRF
to VPN.
Required parameters
-"""""""""""""""""""
+^^^^^^^^^^^^^^^^^^^
Routes exported from a unicast VRF to the VPN RIB must be augmented by two
parameters:
@@ -1682,7 +1779,7 @@ When using the shortcut syntax for vrf-to-vrf leaking, the RD and RT are
auto-derived.
General configuration
-"""""""""""""""""""""
+^^^^^^^^^^^^^^^^^^^^^
Configuration of route leaking between a unicast VRF RIB and the VPN SAFI RIB
of the default VRF is accomplished via commands in the context of a VRF
@@ -1781,86 +1878,6 @@ address-family:
Disables automatic leaking from vrf VRFNAME to the current VRF using
the VPN RIB as intermediary.
-.. _bgp-instances-and-views:
-
-Instances and Views
--------------------
-
-A BGP *instance* is a normal BGP process. Routes selected by BGP are installed
-into the kernel routing table.
-
-.. note::
- In previous versions of FRR, running multiple AS's from the same BGP process
- was not supported; in order to run multiple AS's it was necessary to run
- multiple BGP processes. This had to be explicitly configured with the
- ``bgp multiple-instance`` command. Recent versions of FRR support multiple
- BGP AS's within the same process by simply defining multiple
- ``router bgp X`` blocks, so the ``multiple-instance`` command is now
- unnecessary and deprecated.
-
-.. index:: router bgp AS-NUMBER
-.. clicmd:: router bgp AS-NUMBER
-
- Make a new BGP instance. You can use an arbitrary word for the `name`.
-
- .. code-block:: frr
-
- router bgp 1
- neighbor 10.0.0.1 remote-as 2
- neighbor 10.0.0.2 remote-as 3
- !
- router bgp 2
- neighbor 10.0.0.3 remote-as 4
- neighbor 10.0.0.4 remote-as 5
-
-.. deprecated:: 5.0
- This command does nothing and can be safely removed.
-
-.. index:: bgp multiple-instance
-.. clicmd:: bgp multiple-instance
-
- Enable BGP multiple instance feature. Because this is now the default
- configuration this command will not be displayed in the running
- configuration.
-
-.. deprecated:: 5.0
- This command does nothing and can be safely removed.
-
-.. index:: no bgp multiple-instance
-.. clicmd:: no bgp multiple-instance
-
- In previous versions of FRR, this command disabled the BGP multiple instance
- feature. This functionality is automatically turned on when BGP multiple
- instances or views exist so this command no longer does anything.
-
-BGP views are almost same as normal BGP processes, except that routes selected
-by BGP are not installed into the kernel routing table. The view functionality
-allows the exchange of BGP routing information only without affecting the
-kernel routing tables.
-
-.. index:: router bgp AS-NUMBER view NAME
-.. clicmd:: router bgp AS-NUMBER view NAME
-
- Make a new BGP view. You can use arbitrary word for the ``NAME``. Routes selected by the view are not installed into the kernel routing table.
- view's route selection result does not go to the kernel routing table.
-
- With this command, you can setup Route Server like below.
-
- .. code-block:: frr
-
- !
- router bgp 1 view 1
- neighbor 10.0.0.1 remote-as 2
- neighbor 10.0.0.2 remote-as 3
- !
- router bgp 2 view 2
- neighbor 10.0.0.3 remote-as 4
- neighbor 10.0.0.4 remote-as 5
-
-.. index:: show [ip] bgp view NAME
-.. clicmd:: show [ip] bgp view NAME
-
- Display the routing table of BGP view ``NAME``.
.. _bgp-cisco-compatibility:
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/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/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 6dc2fc529e..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 = \
@@ -207,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
#
@@ -216,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 \
@@ -232,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 f5db6f2421..267dcd1cfc 100644
--- a/lib/thread.c
+++ b/lib/thread.c
@@ -626,7 +626,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);
@@ -641,7 +641,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 2cd3df6432..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;
}
diff --git a/ospf6d/ospf6_area.c b/ospf6d/ospf6_area.c
index f72ca63ff9..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);
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_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 581a969fbc..288ce43f79 100644
--- a/ospfd/ospf_lsa.c
+++ b/ospfd/ospf_lsa.c
@@ -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_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/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/build-debian-package.sh b/tools/build-debian-package.sh
new file mode 100755
index 0000000000..73231f0aec
--- /dev/null
+++ b/tools/build-debian-package.sh
@@ -0,0 +1,40 @@
+#!/bin/sh
+#
+# Written by Daniil Baturin, 2018
+# This file is public domain
+
+git diff-index --quiet HEAD || echo "Warning: git working directory is not clean!"
+
+# Set the defaults
+if [ "$EXTRA_VERSION" = "" ]; then
+ EXTRA_VERSION="-MyDebPkgVersion"
+fi
+
+if [ "$WANT_SNMP" = "" ]; then
+ WANT_SNMP=0
+fi
+
+if [ "$WANT_CUMULUS_MODE" = "" ]; then
+ WANT_CUMULUS_MODE=0
+fi
+
+echo "Preparing the build"
+./bootstrap.sh
+./configure --with-pkg-extra-version=$EXTRA_VERSION
+make dist
+
+echo "Preparing Debian source package"
+mv debianpkg debian
+make -f debian/rules backports
+
+echo "Unpacking the source to frrpkg/"
+mkdir frrpkg
+cd frrpkg
+tar xf ../frr_*.orig.tar.gz
+cd frr*
+. /etc/os-release
+tar xf ../../frr_*${ID}${VERSION_ID}*.debian.tar.xz
+
+echo "Building the Debian package"
+debuild --no-lintian --set-envvar=WANT_SNMP=$WANT_SNMP --set-envvar=WANT_CUMULUS_MODE=$WANT_CUMULUS_MODE -b -uc -us
+
diff --git a/tools/subdir.am b/tools/subdir.am
index 602822e589..323d1222f9 100644
--- a/tools/subdir.am
+++ b/tools/subdir.am
@@ -26,4 +26,5 @@ EXTRA_DIST += \
tools/rrlookup.pl \
tools/zc.pl \
tools/zebra.el \
+ tools/build-debian-package.sh \
# 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 */