/*
- * Copyright (c) 2009, 2010, 2011, 2012 Nicira, Inc.
+ * Copyright (c) 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
* Copyright (c) 2009 InMon Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License");
size_t n_flood, n_all;
struct hmap ports; /* Contains "struct dpif_sflow_port"s. */
uint32_t probability;
+ int ref_cnt;
};
static void dpif_sflow_del_port__(struct dpif_sflow *,
{
struct dpif_sflow_port *dsp;
- HMAP_FOR_EACH_IN_BUCKET (dsp, hmap_node,
- hash_int(odp_to_u32(odp_port), 0),
- &ds->ports) {
+ HMAP_FOR_EACH_IN_BUCKET (dsp, hmap_node, hash_odp_port(odp_port),
+ &ds->ports) {
if (dsp->odp_port == odp_port) {
return dsp;
}
hmap_init(&ds->ports);
ds->probability = 0;
route_table_register();
+ ds->ref_cnt = 1;
return ds;
}
+struct dpif_sflow *
+dpif_sflow_ref(const struct dpif_sflow *ds_)
+{
+ struct dpif_sflow *ds = CONST_CAST(struct dpif_sflow *, ds_);
+ if (ds) {
+ ovs_assert(ds->ref_cnt > 0);
+ ds->ref_cnt++;
+ }
+ return ds;
+}
+
/* 32-bit fraction of packets to sample with. A value of 0 samples no packets,
* a value of %UINT32_MAX samples all packets and intermediate values sample
* intermediate fractions of packets. */
}
void
-dpif_sflow_destroy(struct dpif_sflow *ds)
+dpif_sflow_unref(struct dpif_sflow *ds)
{
- if (ds) {
+ if (!ds) {
+ return;
+ }
+
+ ovs_assert(ds->ref_cnt > 0);
+ if (!--ds->ref_cnt) {
struct dpif_sflow_port *dsp, *next;
route_table_unregister();
dsp->ofport = ofport;
dsp->odp_port = odp_port;
SFL_DS_SET(dsp->dsi, SFL_DSCLASS_IFINDEX, ifindex, 0);
- hmap_insert(&ds->ports, &dsp->hmap_node, hash_int(odp_to_u32(odp_port), 0));
+ hmap_insert(&ds->ports, &dsp->hmap_node, hash_odp_port(odp_port));
/* Add poller. */
if (ds->sflow_agent) {