X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=ofproto%2Fofproto-dpif.c;fp=ofproto%2Fofproto-dpif.c;h=983cad513b1bd5c29ee888439459fae8b432d06f;hb=c12cea0e269986bb0ab75a702da760db745b8143;hp=6a725e465cb1daf60736d0ae3b42d6ec97a77ce5;hpb=4c21aa063fa1c7f95800c95fafebedcd577ce674;p=sliver-openvswitch.git diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index 6a725e465..983cad513 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -3199,14 +3199,21 @@ rule_dpif_lookup(struct ofproto_dpif *ofproto, struct flow *flow, uint8_t table_id; if (ofproto_dpif_get_enable_recirc(ofproto)) { - if (flow->recirc_id == 0) { - if (wc) { - wc->masks.recirc_id = UINT32_MAX; - } - table_id = 0; - } else { - table_id = TBL_INTERNAL; + /* Always exactly match recirc_id since datapath supports + * recirculation. */ + if (wc) { + wc->masks.recirc_id = UINT32_MAX; } + + /* Start looking up from internal table for post recirculation flows + * or packets. We can also simply send all, including normal flows + * or packets to the internal table. They will not match any post + * recirculation rules except the 'catch all' rule that resubmit + * them to table 0. + * + * As an optimization, we send normal flows and packets to table 0 + * directly, saving one table lookup. */ + table_id = flow->recirc_id ? TBL_INTERNAL : 0; } else { table_id = 0; }