examples/ip_pipeline: support rule time read

Add support for the table rule timestamp read operation.

Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
Signed-off-by: Jasvinder Singh <jasvinder.singh@intel.com>
This commit is contained in:
Cristian Dumitrescu 2018-10-30 18:36:55 +00:00
parent 8bfe22acde
commit a3169ee5ec
3 changed files with 209 additions and 0 deletions

View File

@ -5407,6 +5407,92 @@ cmd_pipeline_table_rule_ttl_read(char **tokens,
stats.n_packets); stats.n_packets);
} }
static const char cmd_pipeline_table_rule_time_read_help[] =
"pipeline <pipeline_name> table <table_id> rule read time\n"
" match <match>\n";
static void
cmd_pipeline_table_rule_time_read(char **tokens,
uint32_t n_tokens,
char *out,
size_t out_size)
{
struct table_rule_match m;
char *pipeline_name;
uint64_t timestamp;
uint32_t table_id, n_tokens_parsed;
int status;
if (n_tokens < 7) {
snprintf(out, out_size, MSG_ARG_MISMATCH, tokens[0]);
return;
}
pipeline_name = tokens[1];
if (strcmp(tokens[2], "table") != 0) {
snprintf(out, out_size, MSG_ARG_NOT_FOUND, "table");
return;
}
if (parser_read_uint32(&table_id, tokens[3]) != 0) {
snprintf(out, out_size, MSG_ARG_INVALID, "table_id");
return;
}
if (strcmp(tokens[4], "rule") != 0) {
snprintf(out, out_size, MSG_ARG_NOT_FOUND, "rule");
return;
}
if (strcmp(tokens[5], "read") != 0) {
snprintf(out, out_size, MSG_ARG_NOT_FOUND, "read");
return;
}
if (strcmp(tokens[6], "time") != 0) {
snprintf(out, out_size, MSG_ARG_NOT_FOUND, "time");
return;
}
n_tokens -= 7;
tokens += 7;
/* match */
if ((n_tokens == 0) || strcmp(tokens[0], "match")) {
snprintf(out, out_size, MSG_ARG_NOT_FOUND, "match");
return;
}
n_tokens_parsed = parse_match(tokens,
n_tokens,
out,
out_size,
&m);
if (n_tokens_parsed == 0)
return;
n_tokens -= n_tokens_parsed;
tokens += n_tokens_parsed;
/* end */
if (n_tokens) {
snprintf(out, out_size, MSG_ARG_INVALID, tokens[0]);
return;
}
/* Read table rule timestamp. */
status = pipeline_table_rule_time_read(pipeline_name,
table_id,
&m,
&timestamp);
if (status) {
snprintf(out, out_size, MSG_CMD_FAIL, tokens[0]);
return;
}
/* Print stats. */
snprintf(out, out_size, "Packets: %" PRIu64 "\n", timestamp);
}
static const char cmd_thread_pipeline_enable_help[] = static const char cmd_thread_pipeline_enable_help[] =
"thread <thread_id> pipeline <pipeline_name> enable\n"; "thread <thread_id> pipeline <pipeline_name> enable\n";
@ -5537,6 +5623,7 @@ cmd_help(char **tokens, uint32_t n_tokens, char *out, size_t out_size)
"\tpipeline table rule meter read\n" "\tpipeline table rule meter read\n"
"\tpipeline table dscp\n" "\tpipeline table dscp\n"
"\tpipeline table rule ttl read\n" "\tpipeline table rule ttl read\n"
"\tpipeline table rule time read\n"
"\tthread pipeline enable\n" "\tthread pipeline enable\n"
"\tthread pipeline disable\n\n"); "\tthread pipeline disable\n\n");
return; return;
@ -5788,6 +5875,15 @@ cmd_help(char **tokens, uint32_t n_tokens, char *out, size_t out_size)
cmd_pipeline_table_rule_ttl_read_help); cmd_pipeline_table_rule_ttl_read_help);
return; return;
} }
if ((n_tokens == 5) &&
(strcmp(tokens[2], "rule") == 0) &&
(strcmp(tokens[3], "time") == 0) &&
(strcmp(tokens[4], "read") == 0)) {
snprintf(out, out_size, "\n%s\n",
cmd_pipeline_table_rule_time_read_help);
return;
}
} }
if ((n_tokens == 3) && if ((n_tokens == 3) &&
@ -6096,6 +6192,16 @@ cli_process(char *in, char *out, size_t out_size)
out, out_size); out, out_size);
return; return;
} }
if ((n_tokens >= 7) &&
(strcmp(tokens[2], "table") == 0) &&
(strcmp(tokens[4], "rule") == 0) &&
(strcmp(tokens[5], "read") == 0) &&
(strcmp(tokens[6], "time") == 0)) {
cmd_pipeline_table_rule_time_read(tokens, n_tokens,
out, out_size);
return;
}
} }
if (strcmp(tokens[0], "thread") == 0) { if (strcmp(tokens[0], "thread") == 0) {

View File

@ -389,6 +389,13 @@ pipeline_table_rule_ttl_read(const char *pipeline_name,
struct table_rule_match *match, struct table_rule_match *match,
struct rte_table_action_ttl_counters *stats, struct rte_table_action_ttl_counters *stats,
int clear); int clear);
int
pipeline_table_rule_time_read(const char *pipeline_name,
uint32_t table_id,
struct table_rule_match *match,
uint64_t *timestamp);
struct table_rule * struct table_rule *
table_rule_find(struct table *table, table_rule_find(struct table *table,
struct table_rule_match *match); struct table_rule_match *match);

View File

@ -584,6 +584,7 @@ enum pipeline_req_type {
PIPELINE_REQ_TABLE_RULE_MTR_READ, PIPELINE_REQ_TABLE_RULE_MTR_READ,
PIPELINE_REQ_TABLE_DSCP_TABLE_UPDATE, PIPELINE_REQ_TABLE_DSCP_TABLE_UPDATE,
PIPELINE_REQ_TABLE_RULE_TTL_READ, PIPELINE_REQ_TABLE_RULE_TTL_READ,
PIPELINE_REQ_TABLE_RULE_TIME_READ,
PIPELINE_REQ_MAX PIPELINE_REQ_MAX
}; };
@ -647,6 +648,10 @@ struct pipeline_msg_req_table_rule_ttl_read {
int clear; int clear;
}; };
struct pipeline_msg_req_table_rule_time_read {
void *data;
};
struct pipeline_msg_req { struct pipeline_msg_req {
enum pipeline_req_type type; enum pipeline_req_type type;
uint32_t id; /* Port IN, port OUT or table ID */ uint32_t id; /* Port IN, port OUT or table ID */
@ -666,6 +671,7 @@ struct pipeline_msg_req {
struct pipeline_msg_req_table_rule_mtr_read table_rule_mtr_read; struct pipeline_msg_req_table_rule_mtr_read table_rule_mtr_read;
struct pipeline_msg_req_table_dscp_table_update table_dscp_table_update; struct pipeline_msg_req_table_dscp_table_update table_dscp_table_update;
struct pipeline_msg_req_table_rule_ttl_read table_rule_ttl_read; struct pipeline_msg_req_table_rule_ttl_read table_rule_ttl_read;
struct pipeline_msg_req_table_rule_time_read table_rule_time_read;
}; };
}; };
@ -705,6 +711,10 @@ struct pipeline_msg_rsp_table_rule_ttl_read {
struct rte_table_action_ttl_counters stats; struct rte_table_action_ttl_counters stats;
}; };
struct pipeline_msg_rsp_table_rule_time_read {
uint64_t timestamp;
};
struct pipeline_msg_rsp { struct pipeline_msg_rsp {
int status; int status;
@ -719,6 +729,7 @@ struct pipeline_msg_rsp {
struct pipeline_msg_rsp_table_rule_stats_read table_rule_stats_read; struct pipeline_msg_rsp_table_rule_stats_read table_rule_stats_read;
struct pipeline_msg_rsp_table_rule_mtr_read table_rule_mtr_read; struct pipeline_msg_rsp_table_rule_mtr_read table_rule_mtr_read;
struct pipeline_msg_rsp_table_rule_ttl_read table_rule_ttl_read; struct pipeline_msg_rsp_table_rule_ttl_read table_rule_ttl_read;
struct pipeline_msg_rsp_table_rule_time_read table_rule_time_read;
}; };
}; };
@ -2167,6 +2178,71 @@ pipeline_table_rule_ttl_read(const char *pipeline_name,
return status; return status;
} }
int
pipeline_table_rule_time_read(const char *pipeline_name,
uint32_t table_id,
struct table_rule_match *match,
uint64_t *timestamp)
{
struct pipeline *p;
struct table *table;
struct pipeline_msg_req *req;
struct pipeline_msg_rsp *rsp;
struct table_rule *rule;
int status;
/* Check input params */
if ((pipeline_name == NULL) ||
(match == NULL) ||
(timestamp == NULL))
return -1;
p = pipeline_find(pipeline_name);
if ((p == NULL) ||
(table_id >= p->n_tables) ||
match_check(match, p, table_id))
return -1;
table = &p->table[table_id];
rule = table_rule_find(table, match);
if (rule == NULL)
return -1;
if (!pipeline_is_running(p)) {
status = rte_table_action_time_read(table->a,
rule->data,
timestamp);
return status;
}
/* Allocate request */
req = pipeline_msg_alloc();
if (req == NULL)
return -1;
/* Write request */
req->type = PIPELINE_REQ_TABLE_RULE_TIME_READ;
req->id = table_id;
req->table_rule_time_read.data = rule->data;
/* Send request and wait for response */
rsp = pipeline_msg_send_recv(p, req);
if (rsp == NULL)
return -1;
/* Read response */
status = rsp->status;
if (status == 0)
*timestamp = rsp->table_rule_time_read.timestamp;
/* Free response */
pipeline_msg_free(rsp);
return status;
}
/** /**
* Data plane threads: message handling * Data plane threads: message handling
*/ */
@ -2942,6 +3018,22 @@ pipeline_msg_handle_table_rule_ttl_read(struct pipeline_data *p,
return rsp; return rsp;
} }
static struct pipeline_msg_rsp *
pipeline_msg_handle_table_rule_time_read(struct pipeline_data *p,
struct pipeline_msg_req *req)
{
struct pipeline_msg_rsp *rsp = (struct pipeline_msg_rsp *) req;
uint32_t table_id = req->id;
void *data = req->table_rule_time_read.data;
struct rte_table_action *a = p->table_data[table_id].a;
rsp->status = rte_table_action_time_read(a,
data,
&rsp->table_rule_time_read.timestamp);
return rsp;
}
static void static void
pipeline_msg_handle(struct pipeline_data *p) pipeline_msg_handle(struct pipeline_data *p)
{ {
@ -3018,6 +3110,10 @@ pipeline_msg_handle(struct pipeline_data *p)
rsp = pipeline_msg_handle_table_rule_ttl_read(p, req); rsp = pipeline_msg_handle_table_rule_ttl_read(p, req);
break; break;
case PIPELINE_REQ_TABLE_RULE_TIME_READ:
rsp = pipeline_msg_handle_table_rule_time_read(p, req);
break;
default: default:
rsp = (struct pipeline_msg_rsp *) req; rsp = (struct pipeline_msg_rsp *) req;
rsp->status = -1; rsp->status = -1;