> On Apr 18, 2014, at 1:09 PM, Andy Zhou <az...@nicira.com> wrote: > >> On Fri, Apr 18, 2014 at 12:59 PM, Jarno Rajahalme <jrajaha...@nicira.com> >> wrote: >> >>> On Apr 18, 2014, at 2:50 AM, Andy Zhou <az...@nicira.com> wrote: >>> >>> Currently, all packet lookup starts from internal table for possible >>> matching of post recirculation rules. This is not necessary for >>> datapath that does not support recirculation. >>> >>> This patch adds the ability to steering rule lookup starting table >>> based on whether datapath supports recirculation. >>> >>> Signed-off-by: Andy Zhou <az...@nicira.com>¬ >>> --- >>> ofproto/ofproto-dpif.c | 83 >>> +++++++++++++++++++++++++------------------------- >>> 1 file changed, 41 insertions(+), 42 deletions(-) >>> >>> diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c >>> index 3648dd7..1e51ff2 100644 >>> --- a/ofproto/ofproto-dpif.c >>> +++ b/ofproto/ofproto-dpif.c >>> @@ -3171,41 +3171,57 @@ rule_dpif_get_actions(const struct rule_dpif *rule) >>> return rule_get_actions(&rule->up); >>> } >>> >>> -static uint8_t >>> -rule_dpif_lookup__ (struct ofproto_dpif *ofproto, const struct flow *flow, >>> - struct flow_wildcards *wc, struct rule_dpif **rule) >>> +/* Lookup 'flow' in table 0 of 'ofproto''s classifier. >>> + * If 'wc' is non-null, sets the fields that were relevant as part of >>> + * the lookup. Returns the table_id where a match or miss occurred. >>> + * >>> + * The return value will be zero unless there was a miss and >>> + * OFPTC11_TABLE_MISS_CONTINUE is in effect for the sequence of tables >>> + * where misses occur. */ >>> +uint8_t >>> +rule_dpif_lookup(struct ofproto_dpif *ofproto, struct flow *flow, >>> + struct flow_wildcards *wc, struct rule_dpif **rule) >>> { >>> enum rule_dpif_lookup_verdict verdict; >>> enum ofputil_port_config config = 0; >>> - uint8_t table_id = TBL_INTERNAL; >>> + uint8_t table_id; >>> + >>> + if (ofproto_dpif_get_enable_recirc(ofproto)) { >> >> Would this test be faster as “if (flow->recirc_id)”? > Yes. However the intention is to for non-recirc flows to hit the > recirc_id=0, actions=resubmit(table 0) rule to indicate recirc_id is > significant. > the
You could also mark the mask bits manually, and save the cost of the extra classifier lookup. >> >>> + /* Set metadata to the value of recirc_id to speed up internal >>> + * rule lookup. */ >>> + flow->metadata = htonll(flow->recirc_id); >> >> Since we currently have only one kind of a match pattern in the internal >> table, this will actually make the lookup slightly slower. > This helps if we have multiple bond ports, each one has its own > recirc_id. MPLS recirc may also benefit from this. They still have the same mask, so partitioning has no benefit. >> >>> + table_id = TBL_INTERNAL; >>> + } else { >>> + table_id = 0; >>> + } >>> >>> verdict = rule_dpif_lookup_from_table(ofproto, flow, wc, true, >>> &table_id, rule); >>> >>> switch (verdict) { >>> - case RULE_DPIF_LOOKUP_VERDICT_MATCH: >>> - return table_id; >>> - case RULE_DPIF_LOOKUP_VERDICT_CONTROLLER: { >>> - struct ofport_dpif *port; >>> - >>> - port = get_ofp_port(ofproto, flow->in_port.ofp_port); >>> - if (!port) { >>> - VLOG_WARN_RL(&rl, "packet-in on unknown OpenFlow port %"PRIu16, >>> - flow->in_port.ofp_port); >>> + case RULE_DPIF_LOOKUP_VERDICT_MATCH: >>> + return table_id; >>> + case RULE_DPIF_LOOKUP_VERDICT_CONTROLLER: { >>> + struct ofport_dpif *port; >>> + >>> + port = get_ofp_port(ofproto, flow->in_port.ofp_port); >>> + if (!port) { >>> + VLOG_WARN_RL(&rl, "packet-in on unknown OpenFlow port >>> %"PRIu16, >>> + flow->in_port.ofp_port); >>> + } >>> + config = port ? port->up.pp.config : 0; >>> + break; >>> } >>> - config = port ? port->up.pp.config : 0; >>> - break; >>> - } >>> - case RULE_DPIF_LOOKUP_VERDICT_DROP: >>> - config = OFPUTIL_PC_NO_PACKET_IN; >>> - break; >>> - case RULE_DPIF_LOOKUP_VERDICT_DEFAULT: >>> - if (!connmgr_wants_packet_in_on_miss(ofproto->up.connmgr)) { >>> + case RULE_DPIF_LOOKUP_VERDICT_DROP: >>> config = OFPUTIL_PC_NO_PACKET_IN; >>> - } >>> - break; >>> - default: >>> - OVS_NOT_REACHED(); >>> + break; >>> + case RULE_DPIF_LOOKUP_VERDICT_DEFAULT: >>> + if (!connmgr_wants_packet_in_on_miss(ofproto->up.connmgr)) { >>> + config = OFPUTIL_PC_NO_PACKET_IN; >>> + } >>> + break; >>> + default: >>> + OVS_NOT_REACHED(); >>> } >> >> The previous indentation was according to the CodingStyle. It seems to me >> nothing changed here? > I combined the underscored version function. The diffs are showing > because the code being moved around. Nothing is changed. Nonetheless you seem to have different indentations in switch and the cases? >> >>> choose_miss_rule(config, ofproto->miss_rule, >>> @@ -3213,23 +3229,6 @@ rule_dpif_lookup__ (struct ofproto_dpif *ofproto, >>> const struct flow *flow, >>> return table_id; >>> } >>> >>> -/* Lookup 'flow' in table 0 of 'ofproto''s classifier. >>> - * If 'wc' is non-null, sets the fields that were relevant as part of >>> - * the lookup. Returns the table_id where a match or miss occurred. >>> - * >>> - * The return value will be zero unless there was a miss and >>> - * OFPTC11_TABLE_MISS_CONTINUE is in effect for the sequence of tables >>> - * where misses occur. */ >>> -uint8_t >>> -rule_dpif_lookup(struct ofproto_dpif *ofproto, struct flow *flow, >>> - struct flow_wildcards *wc, struct rule_dpif **rule) >>> -{ >>> - /* Set metadata to the value of recirc_id to speed up internal >>> - * rule lookup. */ >>> - flow->metadata = htonll(flow->recirc_id); >>> - return rule_dpif_lookup__(ofproto, flow, wc, rule); >>> -} >>> - >>> static struct rule_dpif * >>> rule_dpif_lookup_in_table(struct ofproto_dpif *ofproto, uint8_t table_id, >>> const struct flow *flow, struct flow_wildcards *wc) >>> -- >>> 1.9.1 >>> >>> _______________________________________________ >>> dev mailing list >>> dev@openvswitch.org >>> http://openvswitch.org/mailman/listinfo/dev >> >> >> With the caveats above, >> >> Acked-by: Jarno Rajahalme <jrajaha...@nicira.com> > Thanks, I will wait a bit before pushing in case you have additional comments. >> _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev