struct hmap_node hmap_node; /* In struct dpif_sflow's "ports" hmap. */
SFLDataSource_instance dsi; /* sFlow library's notion of port number. */
struct ofport *ofport; /* To retrive port stats. */
+ uint32_t odp_port;
};
struct dpif_sflow {
HMAP_FOR_EACH_IN_BUCKET (dsp, hmap_node,
hash_int(odp_port, 0), &ds->ports) {
- if (ofp_port_to_odp_port(dsp->ofport->ofp_port) == odp_port) {
+ if (dsp->odp_port == odp_port) {
return dsp;
}
}
sflow_agent_get_counters);
sfl_poller_set_sFlowCpInterval(poller, ds->options->polling_interval);
sfl_poller_set_sFlowCpReceiver(poller, RECEIVER_INDEX);
- sfl_poller_set_bridgePort(poller,
- ofp_port_to_odp_port(dsp->ofport->ofp_port));
+ sfl_poller_set_bridgePort(poller, dsp->odp_port);
}
static void
}
void
-dpif_sflow_add_port(struct dpif_sflow *ds, struct ofport *ofport)
+dpif_sflow_add_port(struct dpif_sflow *ds, struct ofport *ofport,
+ uint32_t odp_port)
{
struct dpif_sflow_port *dsp;
- uint32_t odp_port = ofp_port_to_odp_port(ofport->ofp_port);
uint32_t ifindex;
dpif_sflow_del_port(ds, odp_port);
ifindex = (ds->sflow_agent->subId << 16) + odp_port;
}
dsp->ofport = ofport;
+ dsp->odp_port = odp_port;
SFL_DS_SET(dsp->dsi, 0, ifindex, 0);
hmap_insert(&ds->ports, &dsp->hmap_node, hash_int(odp_port, 0));
void
dpif_sflow_received(struct dpif_sflow *ds, struct ofpbuf *packet,
- const struct flow *flow,
+ const struct flow *flow, uint32_t odp_in_port,
const union user_action_cookie *cookie)
{
SFL_FLOW_SAMPLE_TYPE fs;
/* Build a flow sample */
memset(&fs, 0, sizeof fs);
- in_dsp = dpif_sflow_find_port(ds, ofp_port_to_odp_port(flow->in_port));
+ in_dsp = dpif_sflow_find_port(ds, odp_in_port);
if (!in_dsp) {
return;
}