Skip to content

Commit 32f03d5

Browse files
committed
UniRec output: all elements of IPFIX linked list are now checked in both map and conversion comparator functions
1 parent aa8fe7f commit 32f03d5

File tree

2 files changed

+34
-46
lines changed

2 files changed

+34
-46
lines changed

extra_plugins/output/unirec/src/map.c

Lines changed: 19 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -455,39 +455,32 @@ map_load_line(map_t *map, const char *line, size_t line_id)
455455
static int
456456
map_sort_fn(const void *p1, const void *p2)
457457
{
458-
struct map_rec *rec1 = *(struct map_rec **) p1;
459-
struct map_rec *rec2 = *(struct map_rec **) p2;
458+
const struct map_ipfix_s *ipfix1 = &(*(struct map_rec **) p1)->ipfix;
459+
const struct map_ipfix_s *ipfix2 = &(*(struct map_rec **) p2)->ipfix;
460460

461-
if (rec1->ipfix.source != rec2->ipfix.source) {
462-
return (rec1->ipfix.source < rec2->ipfix.source) ? (-1) : 1;
463-
}
464-
465-
// Primary sort by PEN
466-
if (rec1->ipfix.en != rec2->ipfix.en) {
467-
return (rec1->ipfix.en < rec2->ipfix.en) ? (-1) : 1;
468-
}
469-
470-
// Secondary sort by ID
471-
if (rec1->ipfix.id != rec2->ipfix.id) {
472-
return (rec1->ipfix.id < rec2->ipfix.id) ? (-1) : 1;
473-
}
461+
while (ipfix1 && ipfix2) {
462+
if (ipfix1->source != ipfix2->source) {
463+
return (ipfix1->source < ipfix2->source) ? (-1) : 1;
464+
}
474465

475-
// TODO: better and more readable code
476-
// TODO: check all elements in linked list
477-
if (rec1->ipfix.next != NULL && rec2->ipfix.next != NULL) {
478466
// Primary sort by PEN
479-
if (rec1->ipfix.next->en != rec2->ipfix.next->en) {
480-
return (rec1->ipfix.next->en < rec2->ipfix.next->en) ? (-1) : 1;
467+
if (ipfix1->en != ipfix2->en) {
468+
return (ipfix1->en < ipfix2->en) ? (-1) : 1;
481469
}
482470

483471
// Secondary sort by ID
484-
if (rec1->ipfix.next->id != rec2->ipfix.next->id) {
485-
return (rec1->ipfix.next->id < rec2->ipfix.next->id) ? (-1) : 1;
472+
if (ipfix1->id != ipfix2->id) {
473+
return (ipfix1->id < ipfix2->id) ? (-1) : 1;
486474
}
487-
} else if (rec1->ipfix.next != NULL) {
488-
return -1;
489-
} else if (rec2->ipfix.next != NULL) {
490-
return 1;
475+
476+
ipfix1 = ipfix1->next;
477+
ipfix2 = ipfix2->next;
478+
}
479+
480+
if (ipfix1->next) {
481+
return -1;
482+
} else if (ipfix2->next) {
483+
return 1;
491484
}
492485

493486
return 0;

extra_plugins/output/unirec/src/translator.c

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1308,31 +1308,26 @@ translator_cmp(const void *p1, const void *p2)
13081308
const struct tr_ipfix_s *ipfix1 = &((const struct translator_rec *) p1)->ipfix;
13091309
const struct tr_ipfix_s *ipfix2 = &((const struct translator_rec *) p2)->ipfix;
13101310

1311-
uint64_t elem1_val = ((uint64_t) ipfix1->pen) << 16 | ipfix1->id;
1312-
uint64_t elem2_val = ((uint64_t) ipfix2->pen) << 16 | ipfix2->id;
1311+
while (ipfix1 && ipfix2) {
1312+
uint64_t elem1_val = ((uint64_t) ipfix1->pen) << 16 | ipfix1->id;
1313+
uint64_t elem2_val = ((uint64_t) ipfix2->pen) << 16 | ipfix2->id;
13131314

1314-
if (elem1_val == elem2_val) {
1315-
// TODO: check all ipfix elements
1315+
if (elem1_val < elem2_val) {
1316+
return -1;
1317+
} else if (elem1_val > elem2_val) {
1318+
return 1;
1319+
}
13161320

13171321
ipfix1 = ipfix1->next;
13181322
ipfix2 = ipfix2->next;
1319-
if (ipfix1 && ipfix2) {
1320-
elem1_val = ((uint64_t) ipfix1->pen) << 16 | ipfix1->id;
1321-
elem2_val = ((uint64_t) ipfix2->pen) << 16 | ipfix2->id;
1322-
if (elem1_val == elem2_val) {
1323-
return 0;
1324-
} else {
1325-
return (elem1_val < elem2_val) ? (-1) : 1;
1326-
}
1327-
} else if (ipfix1) {
1328-
return -1;
1329-
} else if (ipfix2) {
1330-
return 1;
1331-
}
1332-
return 0;
1333-
} else {
1334-
return (elem1_val < elem2_val) ? (-1) : 1;
13351323
}
1324+
1325+
if (ipfix1) {
1326+
return -1;
1327+
} else if (ipfix2) {
1328+
return 1;
1329+
}
1330+
return 0;
13361331
}
13371332

13381333
/**

0 commit comments

Comments
 (0)