lldp: add reference counter to struct tlv_packet

Add a reference counter to the tlv_packet structure so that it can be
shared between multiple users and properly free'd when no longer in
use.
This commit is contained in:
Beniamino Galvani
2015-10-02 17:11:40 +02:00
parent 3c2f5a543d
commit 2212d76d08
4 changed files with 31 additions and 9 deletions
+3 -3
View File
@@ -259,7 +259,7 @@ int lldp_mib_update_objects(lldp_chassis *c, tlv_packet *tlv) {
p->until = ttl * USEC_PER_SEC + now(clock_boottime_or_monotonic());
tlv_packet_free(p->packet);
tlv_packet_unref(p->packet);
p->packet = tlv;
prioq_reshuffle(p->c->by_expiry, p, &p->prioq_idx);
@@ -401,7 +401,7 @@ int lldp_mib_add_objects(Prioq *by_expiry,
return 0;
drop:
tlv_packet_free(tlv);
tlv_packet_unref(tlv);
if (new_chassis)
hashmap_remove(neighbour_mib, &c->chassis_id);
@@ -435,7 +435,7 @@ void lldp_neighbour_port_free(lldp_neighbour_port *p) {
if(!p)
return;
tlv_packet_free(p->packet);
tlv_packet_unref(p->packet);
free(p->data);
free(p);
+21 -2
View File
@@ -54,22 +54,41 @@ int tlv_packet_new(tlv_packet **ret) {
return -ENOMEM;
LIST_HEAD_INIT(m->sections);
m->n_ref = 1;
*ret = m;
return 0;
}
void tlv_packet_free(tlv_packet *m) {
tlv_packet *tlv_packet_ref(tlv_packet *m) {
if (!m)
return NULL;
assert(m->n_ref > 0);
m->n_ref++;
return m;
}
tlv_packet *tlv_packet_unref(tlv_packet *m) {
tlv_section *s, *n;
if (!m)
return;
return NULL;
assert(m->n_ref > 0);
m->n_ref--;
if (m->n_ref > 0)
return m;
LIST_FOREACH_SAFE(section, s, n, m->sections)
tlv_section_free(s);
free(m);
return NULL;
}
int tlv_packet_append_bytes(tlv_packet *m, const void *data, size_t data_length) {
+6 -3
View File
@@ -45,6 +45,8 @@ int tlv_section_new(tlv_section **ret);
void tlv_section_free(tlv_section *ret);
struct tlv_packet {
unsigned n_ref;
uint16_t type;
uint16_t length;
usec_t ts;
@@ -61,10 +63,11 @@ struct tlv_packet {
};
int tlv_packet_new(tlv_packet **ret);
void tlv_packet_free(tlv_packet *m);
tlv_packet *tlv_packet_ref(tlv_packet *m);
tlv_packet *tlv_packet_unref(tlv_packet *m);
DEFINE_TRIVIAL_CLEANUP_FUNC(tlv_packet*, tlv_packet_free);
#define _cleanup_tlv_packet_free_ _cleanup_(tlv_packet_freep)
DEFINE_TRIVIAL_CLEANUP_FUNC(tlv_packet*, tlv_packet_unref);
#define _cleanup_tlv_packet_free_ _cleanup_(tlv_packet_unrefp)
int lldp_tlv_packet_open_container(tlv_packet *m, uint16_t type);
int lldp_tlv_packet_close_container(tlv_packet *m);
+1 -1
View File
@@ -338,7 +338,7 @@ int lldp_handle_packet(tlv_packet *tlv, uint16_t length) {
lldp->statistics.stats_frames_in_errors_total ++;
}
tlv_packet_free(tlv);
tlv_packet_unref(tlv);
return 0;
}