]> git.proxmox.com Git - mirror_frr.git/commitdiff
Merge pull request #3087 from opensourcerouting/bfd-memleak
authorQuentin Young <qlyoung@users.noreply.github.com>
Wed, 3 Oct 2018 22:43:34 +0000 (18:43 -0400)
committerGitHub <noreply@github.com>
Wed, 3 Oct 2018 22:43:34 +0000 (18:43 -0400)
bfdd: fix memory leak and echo-mode start

122 files changed:
Makefile.am
bgpd/bgp_errors.c
bgpd/bgp_errors.h
bgpd/bgp_evpn.c
bgpd/bgp_evpn_vty.c
bgpd/bgp_flowspec_vty.c
bgpd/bgp_fsm.c
bgpd/bgp_labelpool.c
bgpd/bgp_main.c
bgpd/bgp_nexthop.c
bgpd/bgp_route.c
bgpd/bgp_routemap.c
bgpd/bgp_rpki.c
bgpd/bgp_zebra.c
bgpd/bgpd.c
bgpd/rfapi/bgp_rfapi_cfg.c
bgpd/rfapi/rfapi.c
bgpd/rfapi/rfapi_rib.c
bgpd/rfapi/rfapi_vty.c
bgpd/rfapi/vnc_export_bgp.c
bgpd/rfapi/vnc_import_bgp.c
bgpd/rfapi/vnc_zebra.c
configure.ac
doc/developer/packaging-debian.rst
doc/user/bgp.rst
eigrpd/eigrp_dump.c
eigrpd/eigrp_fsm.c
eigrpd/eigrp_interface.c
eigrpd/eigrp_query.c
eigrpd/eigrp_topology.c
eigrpd/eigrp_update.c
eigrpd/eigrpd.c
isisd/isis_circuit.c
isisd/isis_dr.c
isisd/isis_events.c
isisd/isis_lsp.c
isisd/isis_mt.c
isisd/isis_pdu.c
isisd/isis_route.c
isisd/isis_spf.c
isisd/isis_spf_private.h
isisd/isis_tlvs.c
isisd/isisd.c
lib/command.c
lib/command_match.c
lib/ferr.c
lib/frr_pthread.c
lib/grammar_sandbox.c
lib/hash.c
lib/if.c
lib/keychain.c
lib/libfrr.c
lib/linklist.c
lib/linklist.h
lib/nexthop_group.c
lib/routemap.c
lib/routemap.h
lib/subdir.am
lib/thread.c
lib/wheel.c
lib/zclient.c
m4/.gitignore
m4/libtool-whole-archive.patch [new file with mode: 0644]
ospf6d/ospf6_abr.c
ospf6d/ospf6_area.c
ospf6d/ospf6_interface.c
ospf6d/ospf6_route.c
ospf6d/ospf6_spf.c
ospf6d/ospf6_top.c
ospfclient/subdir.am
ospfd/ospf_apiserver.c
ospfd/ospf_ase.c
ospfd/ospf_dump.c
ospfd/ospf_dump.h
ospfd/ospf_ext.c
ospfd/ospf_interface.c
ospfd/ospf_ism.c
ospfd/ospf_lsa.c
ospfd/ospf_main.c
ospfd/ospf_opaque.c
ospfd/ospf_packet.c
ospfd/ospf_ri.c
ospfd/ospf_route.c
ospfd/ospf_spf.c
ospfd/ospf_sr.c
ospfd/ospf_te.c
ospfd/ospf_zebra.c
ospfd/ospfd.c
pimd/pim_hello.c
pimd/pim_iface.c
pimd/pim_ifchannel.c
pimd/pim_igmp.c
pimd/pim_instance.c
pimd/pim_jp_agg.c
pimd/pim_msdp.c
pimd/pim_neighbor.c
pimd/pim_nht.c
pimd/pim_oil.c
pimd/pim_rp.c
pimd/pim_ssmpingd.c
pimd/pim_tlv.c
pimd/pim_upstream.c
ripd/rip_offset.c
ripd/ripd.c
ripngd/ripng_nexthop.c
ripngd/ripng_offset.c
ripngd/ripngd.c
tests/bgpd/test_bgp_table.c
tests/bgpd/test_peer_attr.c
tests/isisd/test_fuzz_isis_tlv.c
tools/build-debian-package.sh [new file with mode: 0755]
tools/subdir.am
vtysh/vtysh_config.c
zebra/interface.c
zebra/irdp_interface.c
zebra/label_manager.c
zebra/main.c
zebra/table_manager.c
zebra/zebra_mpls.c
zebra/zebra_rib.c
zebra/zebra_rnh.c
zebra/zebra_vxlan.c

index fb052a8dea721ae605f48d4b847e63b08c9857e3..65aed791522222c1c711313af3b6337784cfa6d1 100644 (file)
@@ -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 \
index bd42901c2dbab7dd019916847408a1af1ec85561..7cebd0e484381a63b8661d317eb1344c8a9e9f1c 100644 (file)
@@ -462,6 +462,12 @@ static struct log_ref ferr_bgp_err[] = {
                .description = "The BGP flowspec subsystem has detected that there was a failure for installation/removal/modification of Flowspec from the dataplane",
                .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,
        }
index 853f2da222d867fd624ced76c0c77b5ef79c2daa..13bd318e274c0484ef17cae0e9dc056bb06ecdf8 100644 (file)
@@ -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);
index 8002ebe1c7dd3cc973307b90ccdd7458c505c28a..c350015cc4890f0b0de9ae47bdde7356dbd0b3c9 100644 (file)
@@ -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);
 }
 
 /*
index 6f907c3ab5eb304c11f10ee17fef8ecee8ec1df0..5a1e8edac49d34b6b1d8a3ec76ef8fff98026bd4 100644 (file)
@@ -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)
index faa88f98506712aa4052299ff27fd2001d06bda7..ceeecc7e19c898df7b60f87c7299d53057080b46 100644 (file)
@@ -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");
        }
index 384d2bca82983306ce39dafd019b7f3c24f296aa..65b8b5bd2d3baaaf1fa013aba68dea3a527c632e 100644 (file)
@@ -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,
index 73d3dc67e8aae9a99d3c5a705d1b0ae4f649e5ed..181f864575a6916ee66f689ff85df43e20d9658f 100644 (file)
@@ -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))) {
 
index 6643795f5535b0b9416898f333d7228309e72379..503c3f9f88ba75917b212d5bcb3ee06ea504a9bc 100644 (file)
@@ -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();
index 64453987d543dc8cb446bd84e793fc17f9a3d47d..ce7f5b40f5db58a0cf570fd0df205667fe32efaa 100644 (file)
@@ -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);
        }
 }
index c5087582041e9e92c82b589f815db774409937f6..715393b91db62ffdc6cc2fb265a78e5606aaecd5 100644 (file)
@@ -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));
 }
index 8e7c0a69dd4a77d78ffd5f75ad938225a6cd787a..0a3e4b3c89d0f69abede91175544aab3b8d004d7 100644 (file)
@@ -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);
index 2e0bb1ae6223ee7bbd7e51f47e6174f60919ae07..56566525a4275417aef799d5d6fd1031f62a27d8 100644 (file)
@@ -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);
index 5ab727111caf150a7ca0e728beb7b1e2e07ebf66..5a5c7c9861635036817959a06faa225db7bbfc63 100644 (file)
@@ -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]);
        }
 }
 
index e4dedc24200fd6b5d0252adb02861a848616acbf..0300485e9110f6bbc97a67f0b5c24d9d8e6dc419 100644 (file)
@@ -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))
index 15e39742480302716e5f52a2b2bf60fa2e7f3a8f..cb45fc8da4d39748f5f6a850b1cc8f9ab00e7423 100644 (file)
@@ -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)
index 16dcbd4ee7a2cc06843ff28d20e12b69eb20c612..c7c2239db736335d5f282593b3cac1a6f66f7392 100644 (file)
@@ -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);
                }
 
index 008da30118a5ab34060436a5ef7b4ef963f1c986..fa8c038d6f1eede0321d0ec56b379b41fb17615f 100644 (file)
@@ -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 */
index 1dc2d02f15719d927fd34736014a25e0ac43195d..1af9479a6a9dd0a592429174ba29aed5a737e8cf 100644 (file)
@@ -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);
                }
 
 
index f830c3ed528f5e1b53b0cd8b1a720eed42337d41..6fcae17a8a265ea577ea5b2ec4b201b197c50436 100644 (file)
@@ -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);
                }
        }
 }
index 71a4485d3976ca1a6b8e94ada2932f8aa4eac0fc..8a286d137791e92909e13f5b2bededb6dae3a818 100644 (file)
@@ -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);
        }
 }
 
index 1db17553683168c8e2f83d21c994881038a9ff59..fdd200ac37bf6deca2999f1a28f750096a223d39 100644 (file)
@@ -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) {
                        /*
index 4d18c7997acefdb3136ab0982d278ae5bfb9e04c..12100121d6e48ec5ec83fc0bad4f881bb9131d59 100755 (executable)
@@ -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 ------------------------------------
index 66339b6d1f79d434b905e1a216e18e04b356ae7d..4ea784c0fcdf86196911f4869939d7481aa4470b 100644 (file)
@@ -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
index d9d496f7fc0092fde4f6b1580ea7a38a2b708bef..f10883b984574c212c8ade18aa5d0a7a715ec384 100644 (file)
@@ -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:
 
index 651a9339d7ba3dd41905e9106b4e5a505e7efdd9..bbe2b88223f3cb013c7074c310caf30ae94f46dd 100644 (file)
@@ -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,
index d291cab4c0c7566237693ff29d127cb0e2c6b9c4..f955e6df0f7fb917945a34780df728842d9848d4 100644 (file)
@@ -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;
 }
index 913db684c1c3cc15e3ae2394293918a2fba4adeb..e450c7d999322c23a718bda5c2f30b690d8c87e9 100644 (file)
@@ -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);
 }
 
index dd4231fa0053f2700e2e6f0acb06f6282d0ba8d4..84dcf5e2d55a081b6dae3685aea58e12b2cf092f 100644 (file)
@@ -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)
index 3520972731b646911dca7f040912685582e3176e..0cb4e0e9f45c3d2086fd399393f287ab16ebf7d1 100644 (file)
@@ -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))
index e0142f6b326363f0f1d0f6a42f2d4e9932238233..8db4903077f466ca404ec65874dc1995256829bf 100644 (file)
@@ -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*/
index e9f81fc1c566c277de7b4e4e0c0cd83aab8beeef..9bbecdf9e39df04e4c38d338d6d1bc607d4a6c49 100644 (file)
@@ -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);
 
index b43a3915ae14f41e5308f6cbbe71073c1a6caa46..58c6dfa3682a53f64c74ef705e5d418a153d7e4b 100644 (file)
@@ -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]) {
index 99506a243d7ab06b71b7267bf53fef01f9c5d3f3..f71fe9555b8da9b7e1b64c24591a3fecdd840522 100644 (file)
@@ -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;
 }
 
index 342787af302c91cb10060f3db87e458371aecd25..5dcc0a1324248abc3efe4a7daf8477ee02336726 100644 (file)
@@ -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;
index b2c6f092eeb4fdd940868f5dca8fa69b066f6192..5418e318900b804b29ab4925e4290f9a95ead7bc 100644 (file)
@@ -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;
 }
 
index 2dfccf9830bdccbeb8a795c68dbe935f7e323a6d..e0227f46563314d28e76f1592bc3d350e3f9d786 100644 (file)
@@ -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 *
index 7843fb9b9df0032d7cc072f99f93ea3477ea50c9..99041b0e61c7e2289c5a5b190325b2dcaecdce48 100644 (file)
@@ -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)
index b1225ae5474c90389539d442a3454cb407bc347d..f9b4a2b146e42760ff64e10c93c848efece820b3 100644 (file)
@@ -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);
index 42a019890fe0ee9d219114134e898e322e50d200..1440a3becf65ff6d18cb97e600782ef50532b3d8 100644 (file)
@@ -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
                         */
index 453abfedd89377a6097fd5ab90c3aae4403d501c..131fa37991a92baa9594b260cf4290f31c39f3eb 100644 (file)
@@ -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__))
index 782462766a0505dfb024fa1c77c01480ce0907e6..fce3a0a113912802fc9b7172a75d26922a6d510c 100644 (file)
@@ -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);
index e3ff3b8d93e377111a666099048a991ef9212319..e5e43c4b7ded8de88fbe7ef3a1da66c1a774173b 100644 (file)
@@ -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) {
index e4e3d786ac22e1364d5b707203daccbc31a30395..60c5f4e75b1d1a223635c7e24c6c0d0fbd2cc1c6 100644 (file)
@@ -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();
 }
index a1ae3ac6b993e6a9e956553e4420c1c7909e0c48..8b34d1e3eb907e6848e75ea6af5edbe23d16c61a 100644 (file)
@@ -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 ----------*/
index afef196cec4ce3cfac14fdc7af747b28eabc91c0..bf89cc7f461e83bb9118891fb45d880831d6edfd 100644 (file)
@@ -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,
index c1ce57e24ea6e15051793b5e5097e2f8329e9220..a0223730b8e4a6e87e2dbe61743c1ddd96305af5 100644 (file)
@@ -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);
 }
index 0d6200b00649d6541ec962d4ff067645501aa321..20d5879c67784278225635c000c540bc00ccf3d7 100644 (file)
@@ -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);
index ee5401b2367a4816111439863c3b67f1d8df51d7..114522a75a95c340b1ce34c9e88657aa3ae5e7d6 100644 (file)
@@ -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);
                        }
                }
        }
index 67e2d366cd40a0c87e0eac7a72523a6a9bfc0520..e952313e8eeb2238f43f070ffb76d2e010fe0055 100644 (file)
--- 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);
 
index 494f6f643088f988f9ff8630d02adcdb2a7d6520..601b44a4f1abe71b2da86129fdd6e736e9f098a3 100644 (file)
@@ -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);
 }
index 2bce4766d3d44af059c2b5068a65b18fdeb611ab..94cd0ab623c8e0e777e2e26d7e00b8e55b653f01 100644 (file)
@@ -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);
+}
index bee9d05a2c78332eea370e5491f0d07706401e18..3aa7cae8b714c7c8d8eeecb9b7aa426ea05e4dca 100644 (file)
@@ -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;
index f5cd44efb0f06318201ca48ffd98cbc21c2907db..0475391e9f98c153f7f4b53aa6d88aa7003eb147 100644 (file)
@@ -235,20 +235,6 @@ extern struct list *list_dup(struct list *l);
 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.
  *
@@ -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.
index 937b84bdddf6c5af6d671b41a2cf3e08d5eb523c..23ea96f75c24a4332a9f453b218e9757f0fdc887 100644 (file)
@@ -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);
 }
index 028351f6c6b37c5d833cd555078fd77e00c267eb..bc45cd51d0bffb47c5220cd8e3278cd9ef1ddee7 100644 (file)
@@ -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);
 
index 191456368740cc4b213b12bff545e64aab9443ad..481b8c4a9a34091b44b55931c8b0953671709aec 100644 (file)
@@ -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,
index 6dc2fc529ef064deb30b3164d3c2bdc7ac8522be..dd2731f74c88e8865ef5132ff888c197d0039412 100644 (file)
@@ -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
index f5db6f24210fa9d2e4f91e8567348533aa1bb2bd..267dcd1cfce4c72c257ed07effca44ac18d077e3 100644 (file)
@@ -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);
index 722b02424a30ebf7b64ad3f6703eccd117e13ef9..69d2fa48dc0b382d2875049139f99a5ec589c5cf 100644 (file)
@@ -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);
index e6626a178b66e46959091fe317c4595a8bf719e9..8b1069b827fe5f4ea5267d0009d9297882408234 100644 (file)
@@ -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);
        }
 }
 
index 357e65588dce38a2ed99904d332d81c69ad8f752..2c04163659b4e08f2324f71e828f015bad1a3595 100644 (file)
@@ -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 (file)
index 0000000..7e2749c
--- /dev/null
@@ -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"
index 2cd3df6432b0f3a13fbd955fa28b4f9b583694e3..1890e9bdc39aba25813a53467f337d4ceaf18df2 100644 (file)
@@ -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;
        }
 
index f72ca63ff9f06c48c6f3a19fc3756b07d2815c9d..c848a16aa94b581973865873a776629850b7a357 100644 (file)
@@ -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);
index 9777a01ae6d665d09f2e8046707b7d49920f3bfc..17a30188c7304879f183dd38648433fdcac1e098 100644 (file)
@@ -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);
index bba3c0db5e3f108d097d5a98d5a4b03de0c56bd8..79e1a44392d9ed5bc44a0cd2b64fe4dff5424f4f 100644 (file)
@@ -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);
        }
 }
index d9ddc1bb832019be8f01f792c0efa0e5dc9ab1a2..2d271c1dabbfac204ccf16b2e1d52ec6a725b424 100644 (file)
@@ -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);
 }
 
index ca1a65ff0b293e7833dcb91bdafc6bdea71a2e49..901a35ccfaec1b1dc7ae6b1630f378db65f181d3 100644 (file)
@@ -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);
index df7d85a1f5d810ed637f425fa9d9bee6f0494f32..d42c5b450e191a6457a172942556ac801219e770 100644 (file)
@@ -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
index 0f7652795073a2dac083216625dfe869889e85ad..d0ee8187229535f9c1f060b6028fdc388da94e33 100644 (file)
@@ -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  */
index 0221d1e1b272afa7d13bb59ec02cc26412ce2674..9492de544f6d792690d2cf254c82971401e17720 100644 (file)
@@ -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);
index d8742943c0043022494ac545da87104a1926715b..48d210d2790270db639984fc3ec37a9c5c3c3fd8 100644 (file)
@@ -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);
 
index 99d7512f16f19c30a44d6171d43085d230eb4930..397f666f6907e845bc7548a22dce88608cb92118 100644 (file)
@@ -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
index 316019c15913d7450301bba6618559ecd5946b51..df64fca883cdaf5577fea0e36bcef0d48ab1b59a 100644 (file)
@@ -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;
 
index 2ad36ae364a3a98db3811067d2fad86b14b92fd3..ddb25a20f61f3dc669021811977406a5f64c79be 100644 (file)
@@ -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);
 }
index 25ab9cbe0fd37cfb3f6d1f865c5aedf466ec731c..ad9b3efe6ee7f1d17d410751f7395004c858fe03 100644 (file)
@@ -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))
index 581a969fbcfd6f0df72d8c6127e5bf336a89c373..288ce43f79dae78b413d2be0c27d6ec6b8cddcce 100644 (file)
@@ -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");
index 9fb0e0ad133ef00092676ba75b8bf1299a01d52c..20632f2840ca44d16ed378431a51b5a7559a7138 100644 (file)
@@ -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();
index e3c830d71b16d64a9f26ed5e81c373a8aeea6ae4..7f96299768ed50ada4caf4b4b556bf61523605df 100644 (file)
@@ -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;
 }
index c4c4d2f0303c6ac2abca34c34009d1b17a274dc7..359d59cb5822c4edadbf8e3c29fcb7035cffa41a 100644 (file)
@@ -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;
index 22262c804f91b35b6b8b0744b82160dcdee2c71c..3b0319b5912b880a64618258f874825c08e2718d 100644 (file)
@@ -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;
 
index b36f2f4652069ee0f95d2775af6980a96856f5ea..7ee91b5b6c9655427fea257512e7fc6f53018c43 100644 (file)
@@ -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);
                }
index 7896fb632aa8119bcf12aabea3b316f5909ff630..9c223facd354b4326175c11d5ece75814c4eab7e 100644 (file)
@@ -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;
index 33ec09b9f3a329e51b248ec7063ee70c373f546a..d793735003b25a72d1a336d30e41989754eff783 100644 (file)
@@ -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);
 }
index 12122e76467c512cfdda5da92f9815c367cc9407..f43038ab8de2986bd1cb26555c7da328a6acce08 100644 (file)
@@ -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);
index 8a7f38b743ba3e1cf32f27dfa87c5d4eb61513cf..fdb87bd1ffee087df380765df43d3f5c6ef99186 100644 (file)
@@ -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);
index d481e9e4c898ec48db6c3501a5d27b5efda87145..dc54f04c07473a69521a6c34e19313813afde006 100644 (file)
@@ -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;
                }
 
index b6c5bc432d766bf2c275d1a7fd8fac15cbbb3da8..e482d321a41b6fef736f0eeeb5843665132f5b9b 100644 (file)
@@ -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)                                       \
index 249b24c0d77415abd2a498bf9d9736a894224b96..1ad71823b89c27808bd97627a2dcf267f92e8c37 100644 (file)
@@ -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;
        }
 
index a3d6a2e658cd4cc4a718eb8c1390f8d201a8e26a..129d569c87a1d15b811b4099bd6e5933be31dac5 100644 (file)
@@ -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);
 
index 64537cfa8411d3cdfcbd3f043819b1451fe4db47..8a2efd41adbc86678b545744441eaee175f680e2 100644 (file)
@@ -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);
index c592a2c047fbc7e910ed716919c7ae3f1b79494f..2550651464321d2cf75fbb73d276d5f841e0ab02 100644 (file)
@@ -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);
 
index c5f5b9c5e0960d846d2fcef0552d89c0dff34c9b..7726ffda576da4c1e982ffec1c0fe035f82fe2cd 100644 (file)
@@ -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);
        }
index 5a75ed329ca7a3600b50e4c724021aa59522a6f1..9ef343a0c5d77cce189b725957bee29bace47d49 100644 (file)
@@ -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)
index bff1e7ff138a7c96d318dae8ae7bed37d54536a7..f402629653ca6ce9c7ab0811029fc69c7a84eb36 100644 (file)
@@ -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)
index 0a64c8db3dc0cf678e7ac9bec6ff0bf76d07f50d..2d808639b553949b21d10ff80f34fc83b588ead9 100644 (file)
@@ -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);
index a0debc0c78f86a0994f9c751fe96c872005714f3..68f7dae128029f03b43e1c693fdd9ce5979d6baa 100644 (file)
@@ -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);
index 51ca0945b95575d59e55c2b2c0e9ece0ce3002af..6b76794b75eecdfd6499975c409505fa0a50a9e4 100644 (file)
@@ -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);
 }
 
 /*
index a5082608b8da98286a9c25ddebe4474cd499060c..c3d958428ca5f43979d1af96424eb013e58e9d99 100644 (file)
@@ -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,
index 70700dd508d1de715715a3e1c4f4b25b4528e8a6..d93a360448edb06fec21146fd20dcecefbe76158 100644 (file)
@@ -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;                            \
                }                                                              \
        }
index 4adfde677582f3ed3aaf5b389514c4f74b6604ed..cd6326f0978e99edf200cec9d335e5ba9fa9c417 100644 (file)
@@ -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)
index ab14c3176d2842e382a5880aa8808f3ae5fbbefb..d2065a4bbbc72098385f0d2f19bb1b7cef4ca699 100644 (file)
@@ -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;
index 94c3d4bc9cbbc92e99d3fe163c03a6b5d3cade2d..444a09914c16a7a51a5e3fd00a7d544055be4da1 100644 (file)
@@ -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);
                        }
index 2e0841c5d4ce936d237d4c0e14311de176e8793b..74a132aa941eb05dfa88f007353d15dcef9023b1 100644 (file)
@@ -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 */
index f8d73250b4b20af0fb0bf3306f6cc0fac9143399..32b81b54802bf911d8c2c4c3d15f6cd48c2c045c 100644 (file)
@@ -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 =
index fbc06b0348d74aab6075bc78852f2371e74d836d..08dc3d8b4d330dd1502960e29f7040679d4156a3 100644 (file)
@@ -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);
                        }
index a0382827b97c331644c0d0195ccdb6b8ef320b51..171b1aa22f7957cc8b07e3bacf0f9b59af7c2304 100644 (file)
@@ -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);
 
index e40fba2457cc03b6663ddd5edb59df9ebe5fcfd7..8e81119f5dc3be6107d7319a9f4b13c0293a6653 100644 (file)
@@ -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;
index b75c1002d43034613d71ad7437f33b30d59696f8..917ea66f133aa6e0bba41b14c9ca48ad3d1f9e4c 100644 (file)
@@ -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 (executable)
index 0000000..73231f0
--- /dev/null
@@ -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
+
index 602822e5897824536951737a1601bbc055c47e78..323d1222f9f4a0c5529b382126fdc8a710374475 100644 (file)
@@ -26,4 +26,5 @@ EXTRA_DIST += \
        tools/rrlookup.pl \
        tools/zc.pl \
        tools/zebra.el \
+       tools/build-debian-package.sh \
        # end
index 9f6e20f2be65090e5f984d89849100f049b6df0a..7a55da462d240cfefc45b3f3a81f8c7d71552f71 100644 (file)
@@ -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);
index 96b244635df98c7f3c7117285adce4914604d939..afb08f7012f00b56f9ba6d2b66e970bc6569db84 100644 (file)
@@ -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) {
index 5fdaae4fe5bf55052f501749d8f73acde8d69772..3e50550dd2f8dcd9a541bff34baee9c147f0f9e6 100644 (file)
@@ -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;
 }
index 2b0508099f78b42551f04b9047837cc18858ea8c..8afb1a0b79f452bfb2a688baa9fa47eed60a709d 100644 (file)
@@ -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);
 }
index c46f8bb95d59a6d79f1f9feea625355db5c2290e..148bcab7e4dd9eeaf78e7c8f19278efa6a716b7d 100644 (file)
@@ -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);
 
index 91b45f3f07e99f804159bc1316722c5fe69a1e1b..7ed673a88f12ee73a5d64f798c2dd7c9518f0410 100644 (file)
@@ -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);
 }
index 0d1ccdc5aa0c263ad899164b3616c7fef9fc9347..0ccd3242d59dc28411b2aff650605de3c3f450c5 100644 (file)
@@ -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);
 }
 
index a8f34935475c5fab8787d8cd7aa0b38c8738cb5c..bdcf03a0558c93f6bbf1a41413d4432f1db573fb 100644 (file)
@@ -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);
 }
index 30062a0728676c2ab832153aebf5a30ca4cb5018..622ed5ac05833be2e2b1def29711ee335fee5e5c 100644 (file)
@@ -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);
 }
index 989d63f9b1ff58ab56c02ae6d4abef522f899064..f8417503ef126a563a2aa8b50374c86bbbd3e13e 100644 (file)
@@ -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 */