Skip to content

Commit 23e72ab

Browse files
authored
Merge pull request #20351 from vjardin/isis_cleanup
isisd clean up: migrate lists to typesafe DLIST and fix minor memory leaks
2 parents c6c30a2 + 5d14c05 commit 23e72ab

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+4288
-6971
lines changed

isisd/fabricd.c

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -158,10 +158,9 @@ static int fabricd_handle_adj_state_change(struct isis_adjacency *arg)
158158
while (!skiplist_empty(f->neighbors))
159159
skiplist_delete_first(f->neighbors);
160160

161-
struct listnode *node;
162161
struct isis_circuit *circuit;
163162

164-
for (ALL_LIST_ELEMENTS_RO(f->area->circuit_list, node, circuit)) {
163+
frr_each (isis_circuit_list, &f->area->circuit_list, circuit) {
165164
if (circuit->state != C_STATE_UP)
166165
continue;
167166

@@ -705,10 +704,9 @@ void fabricd_trigger_csnp(struct isis_area *area, bool circuit_scoped)
705704
if (!circuit_scoped && !f->always_send_csnp)
706705
return;
707706

708-
struct listnode *node;
709707
struct isis_circuit *circuit;
710708

711-
for (ALL_LIST_ELEMENTS_RO(area->circuit_list, node, circuit)) {
709+
frr_each (isis_circuit_list, &area->circuit_list, circuit) {
712710
if (!circuit->t_send_csnp[1])
713711
continue;
714712

@@ -724,13 +722,12 @@ struct list *fabricd_ip_addrs(struct isis_circuit *circuit)
724722
if (listcount(circuit->ip_addrs))
725723
return circuit->ip_addrs;
726724

727-
if (!fabricd || !circuit->area || !circuit->area->circuit_list)
725+
if (!fabricd || !circuit->area)
728726
return NULL;
729727

730-
struct listnode *node;
731728
struct isis_circuit *c;
732729

733-
for (ALL_LIST_ELEMENTS_RO(circuit->area->circuit_list, node, c)) {
730+
frr_each (isis_circuit_list, &circuit->area->circuit_list, c) {
734731
if (c->circ_type != CIRCUIT_T_LOOPBACK)
735732
continue;
736733

isisd/isis_adjacency.c

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ struct isis_adjacency *isis_new_adj(const uint8_t *id, const uint8_t *snpa,
9292
}
9393
adj->adj_sids = list_new();
9494
adj->srv6_endx_sids = list_new();
95-
listnode_add(circuit->area->adjacency_list, adj);
95+
isis_area_adj_list_add_tail(&circuit->area->adjacency_list, adj);
9696

9797
return adj;
9898
}
@@ -122,13 +122,12 @@ struct isis_adjacency *isis_adj_lookup_snpa(const uint8_t *ssnpa,
122122
return NULL;
123123
}
124124

125-
struct isis_adjacency *isis_adj_find(const struct isis_area *area, int level,
126-
const uint8_t *sysid)
125+
const struct isis_adjacency *isis_adj_find(const struct isis_area *area,
126+
int level, const uint8_t *sysid)
127127
{
128-
struct isis_adjacency *adj;
129-
struct listnode *node;
128+
const struct isis_adjacency *adj;
130129

131-
for (ALL_LIST_ELEMENTS_RO(area->adjacency_list, node, adj)) {
130+
frr_each (isis_area_adj_list_const, &area->adjacency_list, adj) {
132131
if (!(adj->level & level))
133132
continue;
134133

@@ -164,7 +163,7 @@ void isis_delete_adj(void *arg)
164163
list_delete(&adj->adj_sids);
165164
list_delete(&adj->srv6_endx_sids);
166165

167-
listnode_delete(adj->circuit->area->adjacency_list, adj);
166+
isis_area_adj_list_del(&adj->circuit->area->adjacency_list, adj);
168167
XFREE(MTYPE_ISIS_ADJACENCY, adj);
169168
return;
170169
}

isisd/isis_adjacency.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@
1212
#ifndef _ZEBRA_ISIS_ADJACENCY_H
1313
#define _ZEBRA_ISIS_ADJACENCY_H
1414

15+
#include "typesafe.h"
1516
#include "isisd/isis_tlvs.h"
17+
#include "isisd/isisd.h"
1618

1719
DECLARE_MTYPE(ISIS_ADJACENCY_INFO);
1820

@@ -98,16 +100,22 @@ struct isis_adjacency {
98100
struct listnode *snmp_list_node;
99101

100102
struct list *srv6_endx_sids; /* SRv6 End.X SIDs. */
103+
104+
/* Typesafe list membership for area->adjacency_list */
105+
struct isis_area_adj_list_item area_adj_list_item;
101106
};
102107

108+
/* Typesafe list definition for adjacency_list */
109+
DECLARE_DLIST(isis_area_adj_list, struct isis_adjacency, area_adj_list_item);
110+
103111
struct isis_threeway_adj;
104112

105113
struct isis_adjacency *isis_adj_lookup(const uint8_t *sysid,
106114
struct list *adjdb);
107115
struct isis_adjacency *isis_adj_lookup_snpa(const uint8_t *ssnpa,
108116
struct list *adjdb);
109-
struct isis_adjacency *isis_adj_find(const struct isis_area *area, int level,
110-
const uint8_t *sysid);
117+
const struct isis_adjacency *isis_adj_find(const struct isis_area *area,
118+
int level, const uint8_t *sysid);
111119
struct isis_adjacency *isis_new_adj(const uint8_t *id, const uint8_t *snpa,
112120
int level, struct isis_circuit *circuit);
113121
void isis_delete_adj(void *adj);

isisd/isis_affinitymap.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,15 @@ static void isis_affinity_map_update(const char *affmap_name, uint16_t old_pos,
1515
uint16_t new_pos)
1616
{
1717
struct isis *isis = isis_lookup_by_vrfid(VRF_DEFAULT);
18-
struct listnode *area_node, *fa_node;
18+
struct listnode *fa_node;
1919
struct isis_area *area;
2020
struct flex_algo *fa;
2121
bool changed;
2222

2323
if (!isis)
2424
return;
2525

26-
for (ALL_LIST_ELEMENTS_RO(isis->area_list, area_node, area)) {
26+
frr_each (isis_area_list, &isis->area_list, area) {
2727
changed = false;
2828
for (ALL_LIST_ELEMENTS_RO(area->flex_algos->flex_algos, fa_node,
2929
fa)) {

isisd/isis_bfd.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,12 +191,11 @@ static int bfd_handle_adj_ip_enabled(struct isis_adjacency *adj, int family,
191191
static int bfd_handle_circuit_add_addr(struct isis_circuit *circuit)
192192
{
193193
struct isis_adjacency *adj;
194-
struct listnode *node;
195194

196195
if (circuit->area == NULL)
197196
return 0;
198197

199-
for (ALL_LIST_ELEMENTS_RO(circuit->area->adjacency_list, node, adj)) {
198+
frr_each (isis_area_adj_list, &circuit->area->adjacency_list, adj) {
200199
if (adj->bfd_session)
201200
continue;
202201

isisd/isis_circuit.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ void isis_circuit_configure(struct isis_circuit *circuit,
240240
/*
241241
* Add the circuit into area
242242
*/
243-
listnode_add(area->circuit_list, circuit);
243+
isis_circuit_list_add_tail(&area->circuit_list, circuit);
244244

245245
circuit->idx = flags_get_index(&area->flags);
246246

@@ -263,7 +263,7 @@ void isis_circuit_deconfigure(struct isis_circuit *circuit,
263263

264264
/* Remove circuit from area */
265265
assert(circuit->area == area);
266-
listnode_delete(area->circuit_list, circuit);
266+
isis_circuit_list_del(&area->circuit_list, circuit);
267267
circuit->area = NULL;
268268
circuit->isis = NULL;
269269

@@ -630,7 +630,7 @@ void isis_circuit_prepare(struct isis_circuit *circuit)
630630
&circuit->t_read);
631631
#else
632632
event_add_timer_msec(master, isis_receive, circuit,
633-
listcount(circuit->area->circuit_list) * 100,
633+
isis_circuit_list_count(&circuit->area->circuit_list) * 100,
634634
&circuit->t_read);
635635
#endif
636636
}

0 commit comments

Comments
 (0)