X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=ofproto%2Fofproto-dpif-ipfix.c;h=ef0e980d10dfe6b7ca6804ade913244e36904546;hb=f80022d9df98d29ee41176a4bc6cb91025da84b8;hp=9de8b1cd0061b784e2b3f0173eb7c7bcc28a406d;hpb=4816a18f33380a33d381b77d41df39113c94500d;p=sliver-openvswitch.git diff --git a/ofproto/ofproto-dpif-ipfix.c b/ofproto/ofproto-dpif-ipfix.c index 9de8b1cd0..ef0e980d1 100644 --- a/ofproto/ofproto-dpif-ipfix.c +++ b/ofproto/ofproto-dpif-ipfix.c @@ -62,6 +62,7 @@ struct dpif_ipfix_flow_exporter_map_node { struct dpif_ipfix { struct dpif_ipfix_bridge_exporter bridge_exporter; struct hmap flow_exporter_map; /* dpif_ipfix_flow_exporter_map_nodes. */ + int ref_cnt; }; #define IPFIX_VERSION 0x000a @@ -464,6 +465,18 @@ dpif_ipfix_create(void) di = xzalloc(sizeof *di); dpif_ipfix_exporter_clear(&di->bridge_exporter.exporter); hmap_init(&di->flow_exporter_map); + di->ref_cnt = 1; + return di; +} + +struct dpif_ipfix * +dpif_ipfix_ref(const struct dpif_ipfix *di_) +{ + struct dpif_ipfix *di = CONST_CAST(struct dpif_ipfix *, di_); + if (di) { + ovs_assert(di->ref_cnt > 0); + di->ref_cnt++; + } return di; } @@ -488,9 +501,14 @@ dpif_ipfix_clear(struct dpif_ipfix *di) } void -dpif_ipfix_destroy(struct dpif_ipfix *di) +dpif_ipfix_unref(struct dpif_ipfix *di) { - if (di) { + if (!di) { + return; + } + + ovs_assert(di->ref_cnt > 0); + if (!--di->ref_cnt) { dpif_ipfix_clear(di); hmap_destroy(&di->flow_exporter_map); free(di); @@ -651,7 +669,7 @@ ipfix_send_template_msg(struct dpif_ipfix_exporter *exporter, set_hdr = (struct ipfix_set_header*)((uint8_t*)msg.data + set_hdr_offset); set_hdr->length = htons(msg.size - set_hdr_offset); - /* TODO: Add Options Template Sets, at least to define a Flow Keys + /* XXX: Add Options Template Sets, at least to define a Flow Keys * Option Template. */ ipfix_send_msg(exporter->collectors, &msg);