summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorCristian Dumitrescu <cristian.dumitrescu@intel.com>2018-10-30 17:36:41 +0000
committerCristian Dumitrescu <cristian.dumitrescu@intel.com>2018-11-02 12:24:43 +0100
commit35c10b587def1cb729954ddb0e96ff09cb230c25 (patch)
treef7317d6c0f82af2c3d4ffbb8ebeb6a6e52b89401 /examples
parent69fd1729c63277758cc9d3706b2c9751b22d6da8 (diff)
downloaddpdk-35c10b587def1cb729954ddb0e96ff09cb230c25.zip
dpdk-35c10b587def1cb729954ddb0e96ff09cb230c25.tar.gz
dpdk-35c10b587def1cb729954ddb0e96ff09cb230c25.tar.xz
examples/ip_pipeline: add rule list per table
For each pipeline table, have the master thread maintain the list of rules that are currently stored in the table. This list allows the master thread to handle table queries with minimal impact for the data plane threads: requests to read the current set of table rules are fully handled by the master thread with no involvement from data plane threads, requests to read the per table rule moving data (such as stats counters or timestamp associated with specific actions) are handled by the data plane threads through plain memory reads rather than key lookup. Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com> Signed-off-by: Jasvinder Singh <jasvinder.singh@intel.com> Signed-off-by: Hongjun Ni <hongjun.ni@intel.com>
Diffstat (limited to 'examples')
-rw-r--r--examples/ip_pipeline/pipeline.c88
-rw-r--r--examples/ip_pipeline/pipeline.h36
2 files changed, 124 insertions, 0 deletions
diff --git a/examples/ip_pipeline/pipeline.c b/examples/ip_pipeline/pipeline.c
index b23d6c0..78d590d 100644
--- a/examples/ip_pipeline/pipeline.c
+++ b/examples/ip_pipeline/pipeline.c
@@ -1041,7 +1041,95 @@ pipeline_table_create(const char *pipeline_name,
memcpy(&table->params, params, sizeof(*params));
table->ap = ap;
table->a = action;
+ TAILQ_INIT(&table->rules);
+ table->rule_default = NULL;
+
pipeline->n_tables++;
return 0;
}
+
+struct table_rule *
+table_rule_find(struct table *table,
+ struct table_rule_match *match)
+{
+ struct table_rule *rule;
+
+ TAILQ_FOREACH(rule, &table->rules, node)
+ if (memcmp(&rule->match, match, sizeof(*match)) == 0)
+ return rule;
+
+ return NULL;
+}
+
+void
+table_rule_add(struct table *table,
+ struct table_rule *new_rule)
+{
+ struct table_rule *existing_rule;
+
+ existing_rule = table_rule_find(table, &new_rule->match);
+ if (existing_rule == NULL)
+ TAILQ_INSERT_TAIL(&table->rules, new_rule, node);
+ else {
+ TAILQ_INSERT_AFTER(&table->rules, existing_rule, new_rule, node);
+ TAILQ_REMOVE(&table->rules, existing_rule, node);
+ free(existing_rule);
+ }
+}
+
+void
+table_rule_add_bulk(struct table *table,
+ struct table_rule_list *list,
+ uint32_t n_rules)
+{
+ uint32_t i;
+
+ for (i = 0; i < n_rules; i++) {
+ struct table_rule *existing_rule, *new_rule;
+
+ new_rule = TAILQ_FIRST(list);
+ if (new_rule == NULL)
+ break;
+
+ TAILQ_REMOVE(list, new_rule, node);
+
+ existing_rule = table_rule_find(table, &new_rule->match);
+ if (existing_rule == NULL)
+ TAILQ_INSERT_TAIL(&table->rules, new_rule, node);
+ else {
+ TAILQ_INSERT_AFTER(&table->rules, existing_rule, new_rule, node);
+ TAILQ_REMOVE(&table->rules, existing_rule, node);
+ free(existing_rule);
+ }
+ }
+}
+
+void
+table_rule_delete(struct table *table,
+ struct table_rule_match *match)
+{
+ struct table_rule *rule;
+
+ rule = table_rule_find(table, match);
+ if (rule == NULL)
+ return;
+
+ TAILQ_REMOVE(&table->rules, rule, node);
+ free(rule);
+}
+
+void
+table_rule_default_add(struct table *table,
+ struct table_rule *rule)
+{
+ free(table->rule_default);
+ table->rule_default = rule;
+}
+
+void
+table_rule_default_delete(struct table *table)
+{
+ free(table->rule_default);
+ table->rule_default = NULL;
+}
diff --git a/examples/ip_pipeline/pipeline.h b/examples/ip_pipeline/pipeline.h
index e5b1d5d..2034504 100644
--- a/examples/ip_pipeline/pipeline.h
+++ b/examples/ip_pipeline/pipeline.h
@@ -143,6 +143,10 @@ struct table_params {
const char *action_profile_name;
};
+struct table_rule;
+
+TAILQ_HEAD(table_rule_list, table_rule);
+
struct port_in {
struct port_in_params params;
struct port_in_action_profile *ap;
@@ -153,6 +157,8 @@ struct table {
struct table_params params;
struct table_action_profile *ap;
struct rte_table_action *a;
+ struct table_rule_list rules;
+ struct table_rule *rule_default;
};
struct pipeline {
@@ -286,6 +292,13 @@ struct table_rule_action {
struct rte_table_action_decap_params decap;
};
+struct table_rule {
+ TAILQ_ENTRY(table_rule) node;
+ struct table_rule_match match;
+ struct table_rule_action action;
+ void *data;
+};
+
int
pipeline_port_in_stats_read(const char *pipeline_name,
uint32_t port_id,
@@ -380,5 +393,28 @@ pipeline_table_rule_ttl_read(const char *pipeline_name,
void *data,
struct rte_table_action_ttl_counters *stats,
int clear);
+struct table_rule *
+table_rule_find(struct table *table,
+ struct table_rule_match *match);
+
+void
+table_rule_add(struct table *table,
+ struct table_rule *rule);
+
+void
+table_rule_add_bulk(struct table *table,
+ struct table_rule_list *list,
+ uint32_t n_rules);
+
+void
+table_rule_delete(struct table *table,
+ struct table_rule_match *match);
+
+void
+table_rule_default_add(struct table *table,
+ struct table_rule *rule);
+
+void
+table_rule_default_delete(struct table *table);
#endif /* _INCLUDE_PIPELINE_H_ */