mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-16 02:20:17 +00:00
Merge pull request #7526 from donaldsharp/i_am_a_robot_wumpalump
Cleanup on Aisle 5: Memory leaks, Uninited data and code snarfles
This commit is contained in:
commit
e5c317bcfa
@ -187,6 +187,7 @@ babel_interface_address_delete (ZAPI_CALLBACK_ARGS)
|
||||
send_request(ifc->ifp, NULL, 0);
|
||||
send_update(ifc->ifp, 0, NULL, 0);
|
||||
|
||||
connected_free(&ifc);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -794,7 +794,10 @@ static int bfdd_interface_address_update(ZAPI_CALLBACK_ARGS)
|
||||
: "delete",
|
||||
ifc->address);
|
||||
|
||||
bfdd_sessions_enable_address(ifc);
|
||||
if (cmd == ZEBRA_INTERFACE_ADDRESS_ADD)
|
||||
bfdd_sessions_enable_address(ifc);
|
||||
else
|
||||
connected_free(&ifc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -80,14 +80,12 @@ void bgp_addpath_init_bgp_data(struct bgp_addpath_bgp_data *d)
|
||||
afi_t afi;
|
||||
int i;
|
||||
|
||||
for (afi = AFI_IP; afi < AFI_MAX; afi++) {
|
||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
|
||||
for (i = 0; i < BGP_ADDPATH_MAX; i++) {
|
||||
d->id_allocators[afi][safi][i] = NULL;
|
||||
d->peercount[afi][safi][i] = 0;
|
||||
}
|
||||
d->total_peercount[afi][safi] = 0;
|
||||
FOREACH_AFI_SAFI (afi, safi) {
|
||||
for (i = 0; i < BGP_ADDPATH_MAX; i++) {
|
||||
d->id_allocators[afi][safi][i] = NULL;
|
||||
d->peercount[afi][safi][i] = 0;
|
||||
}
|
||||
d->total_peercount[afi][safi] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -279,18 +279,17 @@ static void bgp_update_explicit_eors(struct peer *peer)
|
||||
if (bgp_debug_neighbor_events(peer))
|
||||
zlog_debug("Peer %s: Checking explicit EORs", peer->host);
|
||||
|
||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
|
||||
if (peer->afc_nego[afi][safi]
|
||||
&& !CHECK_FLAG(peer->af_sflags[afi][safi],
|
||||
PEER_STATUS_EOR_RECEIVED)) {
|
||||
if (bgp_debug_neighbor_events(peer))
|
||||
zlog_debug(
|
||||
" afi %d safi %d didn't receive EOR",
|
||||
afi, safi);
|
||||
return;
|
||||
}
|
||||
FOREACH_AFI_SAFI (afi, safi) {
|
||||
if (peer->afc_nego[afi][safi]
|
||||
&& !CHECK_FLAG(peer->af_sflags[afi][safi],
|
||||
PEER_STATUS_EOR_RECEIVED)) {
|
||||
if (bgp_debug_neighbor_events(peer))
|
||||
zlog_debug(
|
||||
" afi %d safi %d didn't receive EOR",
|
||||
afi, safi);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
peer->update_delay_over = 1;
|
||||
peer->bgp->explicit_eors++;
|
||||
|
@ -241,6 +241,9 @@ void bgp_path_info_extra_free(struct bgp_path_info_extra **extra)
|
||||
if (e->bgp_orig)
|
||||
bgp_unlock(e->bgp_orig);
|
||||
|
||||
if (e->aggr_suppressors)
|
||||
list_delete(&e->aggr_suppressors);
|
||||
|
||||
if ((*extra)->bgp_fs_iprule)
|
||||
list_delete(&((*extra)->bgp_fs_iprule));
|
||||
if ((*extra)->bgp_fs_pbr)
|
||||
@ -11214,6 +11217,7 @@ static int bgp_show_lcommunity(struct vty *vty, struct bgp *bgp, int argc,
|
||||
char *str;
|
||||
int first = 0;
|
||||
uint8_t show_flags = 0;
|
||||
int ret;
|
||||
|
||||
if (uj)
|
||||
SET_FLAG(show_flags, BGP_SHOW_OPT_JSON);
|
||||
@ -11241,10 +11245,13 @@ static int bgp_show_lcommunity(struct vty *vty, struct bgp *bgp, int argc,
|
||||
return CMD_WARNING;
|
||||
}
|
||||
|
||||
return bgp_show(vty, bgp, afi, safi,
|
||||
ret = bgp_show(vty, bgp, afi, safi,
|
||||
(exact ? bgp_show_type_lcommunity_exact
|
||||
: bgp_show_type_lcommunity),
|
||||
lcom, show_flags);
|
||||
|
||||
lcommunity_free(&lcom);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int bgp_show_lcommunity_list(struct vty *vty, struct bgp *bgp,
|
||||
|
@ -531,9 +531,9 @@ static int zebra_read_route(ZAPI_CALLBACK_ARGS)
|
||||
api.instance, &api.prefix, buf, nhtype, ifindex,
|
||||
api.metric, api.tag);
|
||||
} else {
|
||||
zlog_debug("Rx route DEL VRF %u %s[%d] %s", vrf_id,
|
||||
zlog_debug("Rx route DEL VRF %u %s[%d] %pFX", vrf_id,
|
||||
zebra_route_string(api.type), api.instance,
|
||||
buf);
|
||||
&api.prefix);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2840,6 +2840,7 @@ static int bgp_zebra_process_local_macip(ZAPI_CALLBACK_ARGS)
|
||||
stream_get(&esi, s, sizeof(esi_t));
|
||||
} else {
|
||||
state = stream_getl(s);
|
||||
memset(&esi, 0, sizeof(esi_t));
|
||||
}
|
||||
|
||||
bgp = bgp_lookup_by_vrf_id(vrf_id);
|
||||
|
17
bgpd/bgpd.c
17
bgpd/bgpd.c
@ -1094,6 +1094,15 @@ static void peer_free(struct peer *peer)
|
||||
bgp_delete_connected_nexthop(family2afi(peer->su.sa.sa_family),
|
||||
peer);
|
||||
|
||||
FOREACH_AFI_SAFI (afi, safi) {
|
||||
if (peer->filter[afi][safi].advmap.aname)
|
||||
XFREE(MTYPE_BGP_FILTER_NAME,
|
||||
peer->filter[afi][safi].advmap.aname);
|
||||
if (peer->filter[afi][safi].advmap.cname)
|
||||
XFREE(MTYPE_BGP_FILTER_NAME,
|
||||
peer->filter[afi][safi].advmap.cname);
|
||||
}
|
||||
|
||||
XFREE(MTYPE_PEER_TX_SHUTDOWN_MSG, peer->tx_shutdown_message);
|
||||
|
||||
XFREE(MTYPE_PEER_DESC, peer->desc);
|
||||
@ -1121,12 +1130,8 @@ static void peer_free(struct peer *peer)
|
||||
|
||||
bfd_info_free(&(peer->bfd_info));
|
||||
|
||||
for (afi = AFI_IP; afi < AFI_MAX; afi++) {
|
||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
|
||||
bgp_addpath_set_peer_type(peer, afi, safi,
|
||||
BGP_ADDPATH_NONE);
|
||||
}
|
||||
}
|
||||
FOREACH_AFI_SAFI (afi, safi)
|
||||
bgp_addpath_set_peer_type(peer, afi, safi, BGP_ADDPATH_NONE);
|
||||
|
||||
bgp_unlock(peer->bgp);
|
||||
|
||||
|
@ -104,10 +104,6 @@ enum bgp_af_index {
|
||||
|
||||
#define AF_FOREACH(af) for ((af) = BGP_AF_START; (af) < BGP_AF_MAX; (af)++)
|
||||
|
||||
#define FOREACH_AFI_SAFI(afi, safi) \
|
||||
for (afi = AFI_IP; afi < AFI_MAX; afi++) \
|
||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
|
||||
|
||||
#define FOREACH_SAFI(safi) \
|
||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
|
||||
|
||||
|
@ -380,6 +380,19 @@ static void isis_redist_update_zebra_subscriptions(struct isis *isis)
|
||||
}
|
||||
}
|
||||
|
||||
void isis_redist_free(struct isis *isis)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < REDIST_PROTOCOL_COUNT; i++) {
|
||||
if (!isis->ext_info[i])
|
||||
continue;
|
||||
|
||||
route_table_finish(isis->ext_info[i]);
|
||||
isis->ext_info[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void isis_redist_set(struct isis_area *area, int level, int family, int type,
|
||||
uint32_t metric, const char *routemap, int originate_type)
|
||||
{
|
||||
|
@ -62,4 +62,5 @@ void isis_redist_set(struct isis_area *area, int level, int family, int type,
|
||||
uint32_t metric, const char *routemap, int originate_type);
|
||||
void isis_redist_unset(struct isis_area *area, int level, int family, int type);
|
||||
|
||||
void isis_redist_free(struct isis *isis);
|
||||
#endif
|
||||
|
@ -1727,6 +1727,11 @@ static struct isis_spf_run *isis_run_spf_arg(struct isis_area *area, int level)
|
||||
return run;
|
||||
}
|
||||
|
||||
void isis_spf_timer_free(void *run)
|
||||
{
|
||||
XFREE(MTYPE_ISIS_SPF_RUN, run);
|
||||
}
|
||||
|
||||
int _isis_spf_schedule(struct isis_area *area, int level,
|
||||
const char *func, const char *file, int line)
|
||||
{
|
||||
|
@ -78,4 +78,5 @@ struct isis_spftree *isis_run_hopcount_spf(struct isis_area *area,
|
||||
uint8_t *sysid,
|
||||
struct isis_spftree *spftree);
|
||||
|
||||
void isis_spf_timer_free(void *run);
|
||||
#endif /* _ZEBRA_ISIS_SPF_H */
|
||||
|
@ -442,7 +442,11 @@ void isis_area_destroy(struct isis_area *area)
|
||||
|
||||
spftree_area_del(area);
|
||||
|
||||
if (area->spf_timer[0])
|
||||
isis_spf_timer_free(THREAD_ARG(area->spf_timer[0]));
|
||||
thread_cancel(&area->spf_timer[0]);
|
||||
if (area->spf_timer[1])
|
||||
isis_spf_timer_free(THREAD_ARG(area->spf_timer[1]));
|
||||
thread_cancel(&area->spf_timer[1]);
|
||||
|
||||
spf_backoff_free(area->spf_delay_ietf[0]);
|
||||
@ -583,6 +587,7 @@ void isis_finish(struct isis *isis)
|
||||
isis_vrf_unlink(isis, vrf);
|
||||
}
|
||||
|
||||
isis_redist_free(isis);
|
||||
list_delete(&isis->area_list);
|
||||
list_delete(&isis->init_circ_list);
|
||||
XFREE(MTYPE_ISIS, isis);
|
||||
@ -2375,6 +2380,9 @@ static void area_resign_level(struct isis_area *area, int level)
|
||||
}
|
||||
}
|
||||
|
||||
if (area->spf_timer[level - 1])
|
||||
isis_spf_timer_free(THREAD_ARG(area->spf_timer[level - 1]));
|
||||
|
||||
thread_cancel(&area->spf_timer[level - 1]);
|
||||
|
||||
sched_debug(
|
||||
|
@ -359,6 +359,10 @@ typedef enum {
|
||||
SAFI_MAX = 8
|
||||
} safi_t;
|
||||
|
||||
#define FOREACH_AFI_SAFI(afi, safi) \
|
||||
for (afi = AFI_IP; afi < AFI_MAX; afi++) \
|
||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
|
||||
|
||||
/* Default Administrative Distance of each protocol. */
|
||||
#define ZEBRA_KERNEL_DISTANCE_DEFAULT 0
|
||||
#define ZEBRA_CONNECT_DISTANCE_DEFAULT 0
|
||||
|
@ -546,19 +546,15 @@ void static_fixup_vrf_ids(struct static_vrf *enable_svrf)
|
||||
|
||||
svrf = vrf->info;
|
||||
/* Install any static routes configured for this VRF. */
|
||||
for (afi = AFI_IP; afi < AFI_MAX; afi++) {
|
||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
|
||||
stable = svrf->stable[afi][safi];
|
||||
if (!stable)
|
||||
continue;
|
||||
FOREACH_AFI_SAFI (afi, safi) {
|
||||
stable = svrf->stable[afi][safi];
|
||||
if (!stable)
|
||||
continue;
|
||||
|
||||
static_fixup_vrf(enable_svrf, stable,
|
||||
afi, safi);
|
||||
static_fixup_vrf(enable_svrf, stable, afi, safi);
|
||||
|
||||
if (enable_svrf == svrf)
|
||||
static_enable_vrf(svrf, stable,
|
||||
afi, safi);
|
||||
}
|
||||
if (enable_svrf == svrf)
|
||||
static_enable_vrf(svrf, stable, afi, safi);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -649,20 +645,17 @@ void static_cleanup_vrf_ids(struct static_vrf *disable_svrf)
|
||||
svrf = vrf->info;
|
||||
|
||||
/* Uninstall any static routes configured for this VRF. */
|
||||
for (afi = AFI_IP; afi < AFI_MAX; afi++) {
|
||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
|
||||
struct route_table *stable;
|
||||
FOREACH_AFI_SAFI (afi, safi) {
|
||||
struct route_table *stable;
|
||||
|
||||
stable = svrf->stable[afi][safi];
|
||||
if (!stable)
|
||||
continue;
|
||||
stable = svrf->stable[afi][safi];
|
||||
if (!stable)
|
||||
continue;
|
||||
|
||||
static_cleanup_vrf(disable_svrf, stable,
|
||||
afi, safi);
|
||||
static_cleanup_vrf(disable_svrf, stable, afi, safi);
|
||||
|
||||
if (disable_svrf == svrf)
|
||||
static_disable_vrf(stable, afi, safi);
|
||||
}
|
||||
if (disable_svrf == svrf)
|
||||
static_disable_vrf(stable, afi, safi);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -725,14 +718,12 @@ void static_install_intf_nh(struct interface *ifp)
|
||||
continue;
|
||||
|
||||
/* Install any static routes configured for this interface. */
|
||||
for (afi = AFI_IP; afi < AFI_MAX; afi++) {
|
||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
|
||||
stable = svrf->stable[afi][safi];
|
||||
if (!stable)
|
||||
continue;
|
||||
FOREACH_AFI_SAFI (afi, safi) {
|
||||
stable = svrf->stable[afi][safi];
|
||||
if (!stable)
|
||||
continue;
|
||||
|
||||
static_fixup_intf_nh(stable, ifp, afi, safi);
|
||||
}
|
||||
static_fixup_intf_nh(stable, ifp, afi, safi);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -238,14 +238,12 @@ int static_vrf_has_config(struct static_vrf *svrf)
|
||||
* NOTE: This is a don't care for the default VRF, but we go through
|
||||
* the motions to keep things consistent.
|
||||
*/
|
||||
for (afi = AFI_IP; afi < AFI_MAX; afi++) {
|
||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
|
||||
table = svrf->stable[afi][safi];
|
||||
if (!table)
|
||||
continue;
|
||||
if (route_table_count(table))
|
||||
return 1;
|
||||
}
|
||||
FOREACH_AFI_SAFI (afi, safi) {
|
||||
table = svrf->stable[afi][safi];
|
||||
if (!table)
|
||||
continue;
|
||||
if (route_table_count(table))
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -106,15 +106,13 @@ static struct bgp *bgp_create_fake(as_t *as, const char *name)
|
||||
// bgp->group->cmp = (int (*)(void *, void *)) peer_group_cmp;
|
||||
|
||||
bgp_evpn_init(bgp);
|
||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
|
||||
bgp->route[afi][safi] = bgp_table_init(bgp, afi, safi);
|
||||
bgp->aggregate[afi][safi] = bgp_table_init(
|
||||
bgp, afi, safi);
|
||||
bgp->rib[afi][safi] = bgp_table_init(bgp, afi, safi);
|
||||
bgp->maxpaths[afi][safi].maxpaths_ebgp = MULTIPATH_NUM;
|
||||
bgp->maxpaths[afi][safi].maxpaths_ibgp = MULTIPATH_NUM;
|
||||
}
|
||||
FOREACH_AFI_SAFI (afi, safi) {
|
||||
bgp->route[afi][safi] = bgp_table_init(bgp, afi, safi);
|
||||
bgp->aggregate[afi][safi] = bgp_table_init(bgp, afi, safi);
|
||||
bgp->rib[afi][safi] = bgp_table_init(bgp, afi, safi);
|
||||
bgp->maxpaths[afi][safi].maxpaths_ebgp = MULTIPATH_NUM;
|
||||
bgp->maxpaths[afi][safi].maxpaths_ibgp = MULTIPATH_NUM;
|
||||
}
|
||||
|
||||
bgp_scan_init(bgp);
|
||||
bgp->default_local_pref = BGP_DEFAULT_LOCAL_PREF;
|
||||
@ -152,36 +150,33 @@ static int run_bgp_cfg_maximum_paths(testcase_t *t)
|
||||
int test_result = TEST_PASSED;
|
||||
|
||||
bgp = t->tmp_data;
|
||||
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
||||
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++) {
|
||||
/* test bgp_maximum_paths_set */
|
||||
api_result = bgp_maximum_paths_set(
|
||||
bgp, afi, safi, BGP_PEER_EBGP, 10, 0);
|
||||
EXPECT_TRUE(api_result == 0, test_result);
|
||||
api_result = bgp_maximum_paths_set(
|
||||
bgp, afi, safi, BGP_PEER_IBGP, 10, 0);
|
||||
EXPECT_TRUE(api_result == 0, test_result);
|
||||
EXPECT_TRUE(bgp->maxpaths[afi][safi].maxpaths_ebgp
|
||||
== 10,
|
||||
test_result);
|
||||
EXPECT_TRUE(bgp->maxpaths[afi][safi].maxpaths_ibgp
|
||||
== 10,
|
||||
test_result);
|
||||
FOREACH_AFI_SAFI (afi, safi) {
|
||||
/* test bgp_maximum_paths_set */
|
||||
api_result = bgp_maximum_paths_set(bgp, afi, safi,
|
||||
BGP_PEER_EBGP, 10, 0);
|
||||
EXPECT_TRUE(api_result == 0, test_result);
|
||||
api_result = bgp_maximum_paths_set(bgp, afi, safi,
|
||||
BGP_PEER_IBGP, 10, 0);
|
||||
EXPECT_TRUE(api_result == 0, test_result);
|
||||
EXPECT_TRUE(bgp->maxpaths[afi][safi].maxpaths_ebgp == 10,
|
||||
test_result);
|
||||
EXPECT_TRUE(bgp->maxpaths[afi][safi].maxpaths_ibgp == 10,
|
||||
test_result);
|
||||
|
||||
/* test bgp_maximum_paths_unset */
|
||||
api_result = bgp_maximum_paths_unset(bgp, afi, safi,
|
||||
BGP_PEER_EBGP);
|
||||
EXPECT_TRUE(api_result == 0, test_result);
|
||||
api_result = bgp_maximum_paths_unset(bgp, afi, safi,
|
||||
BGP_PEER_IBGP);
|
||||
EXPECT_TRUE(api_result == 0, test_result);
|
||||
EXPECT_TRUE((bgp->maxpaths[afi][safi].maxpaths_ebgp
|
||||
== MULTIPATH_NUM),
|
||||
test_result);
|
||||
EXPECT_TRUE((bgp->maxpaths[afi][safi].maxpaths_ibgp
|
||||
== MULTIPATH_NUM),
|
||||
test_result);
|
||||
}
|
||||
/* test bgp_maximum_paths_unset */
|
||||
api_result =
|
||||
bgp_maximum_paths_unset(bgp, afi, safi, BGP_PEER_EBGP);
|
||||
EXPECT_TRUE(api_result == 0, test_result);
|
||||
api_result =
|
||||
bgp_maximum_paths_unset(bgp, afi, safi, BGP_PEER_IBGP);
|
||||
EXPECT_TRUE(api_result == 0, test_result);
|
||||
EXPECT_TRUE((bgp->maxpaths[afi][safi].maxpaths_ebgp
|
||||
== MULTIPATH_NUM),
|
||||
test_result);
|
||||
EXPECT_TRUE((bgp->maxpaths[afi][safi].maxpaths_ibgp
|
||||
== MULTIPATH_NUM),
|
||||
test_result);
|
||||
}
|
||||
|
||||
return test_result;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user