datapath: collect mega flow mask stats
[sliver-openvswitch.git] / datapath / flow_table.c
index 98eb809..b014d92 100644 (file)
@@ -431,13 +431,16 @@ static struct sw_flow *masked_flow_lookup(struct table_instance *ti,
 }
 
 struct sw_flow *ovs_flow_tbl_lookup(struct flow_table *tbl,
-                                   const struct sw_flow_key *key)
+                                   const struct sw_flow_key *key,
+                                   u32 *n_mask_hit)
 {
        struct table_instance *ti = rcu_dereference(tbl->ti);
        struct sw_flow_mask *mask;
        struct sw_flow *flow;
 
+       *n_mask_hit = 0;
        list_for_each_entry_rcu(mask, &tbl->mask_list, list) {
+               (*n_mask_hit)++;
                flow = masked_flow_lookup(ti, key, mask);
                if (flow)  /* Found */
                        return flow;
@@ -445,6 +448,17 @@ struct sw_flow *ovs_flow_tbl_lookup(struct flow_table *tbl,
        return NULL;
 }
 
+int ovs_flow_tbl_num_masks(const struct flow_table *table)
+{
+       struct sw_flow_mask *mask;
+       int num = 0;
+
+       list_for_each_entry(mask, &table->mask_list, list)
+               num++;
+
+       return num;
+}
+
 static struct table_instance *table_instance_expand(struct table_instance *ti)
 {
        return table_instance_rehash(ti, ti->n_buckets * 2);