When handling flow misses, an attempt is made to group identical packets together. Before the single datapath, each OpenFlow port number was unique, so the flow_equal() function was sufficient to check whether packets are identical. With the single datapath, the OpenFlow port numbers are shared across bridges, so packets that arrive at the same time and are identical other than their ingress port were being serviced by the same ofproto instance. This commit changes the duplicate flow finding function to take the ofproto into account.
Bug #14934 Signed-off-by: Justin Pettit <[email protected]> --- ofproto/ofproto-dpif.c | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-) diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index f54f9ff..4232594 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -3341,12 +3341,13 @@ process_special(struct ofproto_dpif *ofproto, const struct flow *flow, } static struct flow_miss * -flow_miss_find(struct hmap *todo, const struct flow *flow, uint32_t hash) +flow_miss_find(struct hmap *todo, const struct ofproto_dpif *ofproto, + const struct flow *flow, uint32_t hash) { struct flow_miss *miss; HMAP_FOR_EACH_WITH_HASH (miss, hmap_node, hash, todo) { - if (flow_equal(&miss->flow, flow)) { + if (miss->ofproto == ofproto && flow_equal(&miss->flow, flow)) { return miss; } } @@ -3814,7 +3815,7 @@ handle_miss_upcalls(struct dpif_backer *backer, struct dpif_upcall *upcalls, /* Add other packets to a to-do list. */ hash = flow_hash(&miss->flow, 0); - existing_miss = flow_miss_find(&todo, &miss->flow, hash); + existing_miss = flow_miss_find(&todo, ofproto, &miss->flow, hash); if (!existing_miss) { hmap_insert(&todo, &miss->hmap_node, hash); miss->ofproto = ofproto; -- 1.7.5.4 _______________________________________________ dev mailing list [email protected] http://openvswitch.org/mailman/listinfo/dev
