X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=ofproto%2Fofproto-dpif-sflow.c;h=69362ab84ed8060a208bbf331692e6ecfa08985c;hb=6042457bd537a2b5140e17e4abceacbaafff6b57;hp=999e55b9155e5aff5b0026500d481e4310a4ce95;hpb=9b56fe137d3c734edcfa00631a960920f04c866a;p=openvswitch diff --git a/ofproto/ofproto-dpif-sflow.c b/ofproto/ofproto-dpif-sflow.c index 999e55b9..69362ab8 100644 --- a/ofproto/ofproto-dpif-sflow.c +++ b/ofproto/ofproto-dpif-sflow.c @@ -46,13 +46,13 @@ struct dpif_sflow_port { 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 { struct collectors *collectors; SFLAgent *sflow_agent; struct ofproto_sflow_options *options; - struct dpif *dpif; time_t next_tick; size_t n_flood, n_all; struct hmap ports; /* Contains "struct dpif_sflow_port"s. */ @@ -148,7 +148,7 @@ dpif_sflow_find_port(const struct dpif_sflow *ds, uint32_t odp_port) 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; } } @@ -179,7 +179,7 @@ sflow_agent_get_counters(void *ds_, SFLPoller *poller, if (!netdev_get_features(dsp->ofport->netdev, ¤t, NULL, NULL, NULL)) { /* The values of ifDirection come from MAU MIB (RFC 2668): 0 = unknown, 1 = full-duplex, 2 = half-duplex, 3 = in, 4=out */ - counters->ifSpeed = netdev_features_to_bps(current); + counters->ifSpeed = netdev_features_to_bps(current, 0); counters->ifDirection = (netdev_features_is_full_duplex(current) ? 1 : 2); } else { @@ -293,12 +293,11 @@ dpif_sflow_is_enabled(const struct dpif_sflow *ds) } struct dpif_sflow * -dpif_sflow_create(struct dpif *dpif) +dpif_sflow_create(void) { struct dpif_sflow *ds; ds = xcalloc(1, sizeof *ds); - ds->dpif = dpif; ds->next_tick = time_now() + 1; hmap_init(&ds->ports); ds->probability = 0; @@ -339,8 +338,7 @@ dpif_sflow_add_poller(struct dpif_sflow *ds, struct dpif_sflow_port *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 @@ -353,10 +351,10 @@ dpif_sflow_add_sampler(struct dpif_sflow *ds, struct dpif_sflow_port *dsp) } 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); @@ -368,6 +366,7 @@ dpif_sflow_add_port(struct dpif_sflow *ds, struct ofport *ofport) 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)); @@ -491,7 +490,7 @@ dpif_sflow_odp_port_to_ifindex(const struct dpif_sflow *ds, 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; @@ -507,7 +506,7 @@ dpif_sflow_received(struct dpif_sflow *ds, struct ofpbuf *packet, /* 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; }