aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Morey-Chaisemartin <nmorey@kalray.eu>2015-10-09 09:34:00 +0200
committerMaxim Uvarov <maxim.uvarov@linaro.org>2015-10-22 15:46:22 +0300
commitc20acf806263c5e4d64728768535aae097e10610 (patch)
tree6e84038888a9889dec65e98d5cfe919dab5c0564
parentf64b306dbc8b8b4ba66cdd4660b0eec250312d7e (diff)
api: classification: use a structure instead of many args for odp_pmr_create
Signed-off-by: Nicolas Morey-Chaisemartin <nmorey@kalray.eu> Reviewed-by: Petri Savolainen <petri.savolainen@nokia.com> Reviewed-by: Balasubramanian Manoharan <bala.manoharan@linaro.org> Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
-rw-r--r--example/classifier/odp_classifier.c12
-rw-r--r--include/odp/api/classification.h31
-rw-r--r--platform/linux-generic/odp_classification.c35
-rw-r--r--test/validation/classification/odp_classification_basic.c18
-rw-r--r--test/validation/classification/odp_classification_tests.c28
5 files changed, 71 insertions, 53 deletions
diff --git a/example/classifier/odp_classifier.c b/example/classifier/odp_classifier.c
index 89ad61b1..92cf1d77 100644
--- a/example/classifier/odp_classifier.c
+++ b/example/classifier/odp_classifier.c
@@ -364,10 +364,14 @@ static void configure_cos_queue(odp_pktio_t pktio, appl_args_t *args)
stats->queue_name);
stats->cos = odp_cos_create(cos_name);
- stats->pmr = odp_pmr_create(stats->rule.term,
- &stats->rule.val,
- &stats->rule.mask,
- stats->val_sz);
+ const odp_pmr_match_t match = {
+ .term = stats->rule.term,
+ .val = &stats->rule.val,
+ .mask = &stats->rule.mask,
+ .val_sz = stats->val_sz
+ };
+
+ stats->pmr = odp_pmr_create(&match);
qparam.sched.prio = i % odp_schedule_num_prio();
qparam.sched.sync = ODP_SCHED_SYNC_NONE;
qparam.sched.group = ODP_SCHED_GROUP_ALL;
diff --git a/include/odp/api/classification.h b/include/odp/api/classification.h
index e6f14cc9..a62528c2 100644
--- a/include/odp/api/classification.h
+++ b/include/odp/api/classification.h
@@ -243,38 +243,24 @@ typedef enum odp_pmr_term {
} odp_pmr_term_e;
/**
- * Following structure is used to define composite packet matching rules
- * in the form of an array of individual match rules.
- * The underlying platform may not support all or any specific combination
- * of value match rules, and the application should take care
- * of inspecting the return value when installing such rules, and perform
- * appropriate fallback action.
+ * Following structure is used to define a packet matching rule
*/
typedef struct odp_pmr_match_t {
odp_pmr_term_e term; /**< PMR term value to be matched */
const void *val; /**< Value to be matched */
const void *mask; /**< Masked set of bits to be matched */
- unsigned int val_sz; /**< Size of the term value */
+ uint32_t val_sz; /**< Size of the term value */
} odp_pmr_match_t;
/**
* Create a packet match rule with mask and value
*
- * @param[in] term One of the enumerated values supported
- * @param[in] val Value to match against the packet header
- * in native byte order.
- * @param[in] mask Mask to indicate which bits of the header
- * should be matched ('1') and
- * which should be ignored ('0')
- * @param[in] val_sz Size of the val and mask arguments,
- * that must match the value size requirement of the
- * specific term.
+ * @param[in] match packet matching rule definition
*
* @return Handle of the matching rule
* @retval ODP_PMR_INVAL on failure
*/
-odp_pmr_t odp_pmr_create(odp_pmr_term_e term, const void *val,
- const void *mask, uint32_t val_sz);
+odp_pmr_t odp_pmr_create(const odp_pmr_match_t *match);
/**
* Invalidate a packet match rule and vacate its resources
@@ -332,7 +318,12 @@ unsigned odp_pmr_terms_avail(void);
*/
/**
- * Create a composite packet match rule
+ * Create a composite packet match rule in the form of an array of individual
+ * match rules.
+ * The underlying platform may not support all or any specific combination
+ * of value match rules, and the application should take care
+ * of inspecting the return value when installing such rules, and perform
+ * appropriate fallback action.
*
* @param[in] num_terms Number of terms in the match rule.
* @param[in] terms Array of num_terms entries, one entry per
@@ -344,7 +335,7 @@ unsigned odp_pmr_terms_avail(void);
* underlying platform classification engine
* @retval <0 on failure
*/
-int odp_pmr_match_set_create(int num_terms, odp_pmr_match_t *terms,
+int odp_pmr_match_set_create(int num_terms, const odp_pmr_match_t *terms,
odp_pmr_set_t *pmr_set_id);
/**
diff --git a/platform/linux-generic/odp_classification.c b/platform/linux-generic/odp_classification.c
index dd12a009..45f62baf 100644
--- a/platform/linux-generic/odp_classification.c
+++ b/platform/linux-generic/odp_classification.c
@@ -444,12 +444,22 @@ int odp_cos_with_l3_qos(odp_pktio_t pktio_in,
return 0;
}
-odp_pmr_t odp_pmr_create(odp_pmr_term_e term, const void *val,
- const void *mask, uint32_t val_sz)
+static void odp_pmr_create_term(pmr_term_value_t *value,
+ const odp_pmr_match_t *match)
+{
+ value->term = match->term;
+ value->val = 0;
+ value->mask = 0;
+ memcpy(&value->val, match->val, match->val_sz);
+ memcpy(&value->mask, match->mask, match->val_sz);
+ value->val &= value->mask;
+}
+
+odp_pmr_t odp_pmr_create(const odp_pmr_match_t *match)
{
pmr_t *pmr;
odp_pmr_t id;
- if (val_sz > ODP_PMR_TERM_BYTES_MAX) {
+ if (match->val_sz > ODP_PMR_TERM_BYTES_MAX) {
ODP_ERR("val_sz greater than max supported limit");
return ODP_PMR_INVAL;
}
@@ -460,12 +470,7 @@ odp_pmr_t odp_pmr_create(odp_pmr_term_e term, const void *val,
return ODP_PMR_INVAL;
pmr->s.num_pmr = 1;
- pmr->s.pmr_term_value[0].term = term;
- pmr->s.pmr_term_value[0].val = 0;
- pmr->s.pmr_term_value[0].mask = 0;
- memcpy(&pmr->s.pmr_term_value[0].val, val, val_sz);
- memcpy(&pmr->s.pmr_term_value[0].mask, mask, val_sz);
- pmr->s.pmr_term_value[0].val &= pmr->s.pmr_term_value[0].mask;
+ odp_pmr_create_term(&pmr->s.pmr_term_value[0], match);
UNLOCK(&pmr->s.lock);
return id;
}
@@ -567,7 +572,7 @@ unsigned odp_pmr_terms_avail(void)
return count;
}
-int odp_pmr_match_set_create(int num_terms, odp_pmr_match_t *terms,
+int odp_pmr_match_set_create(int num_terms, const odp_pmr_match_t *terms,
odp_pmr_set_t *pmr_set_id)
{
pmr_t *pmr;
@@ -593,15 +598,7 @@ int odp_pmr_match_set_create(int num_terms, odp_pmr_match_t *terms,
val_sz = terms[i].val_sz;
if (val_sz > ODP_PMR_TERM_BYTES_MAX)
continue;
- pmr->s.pmr_term_value[i].term = terms[i].term;
- pmr->s.pmr_term_value[i].val = 0;
- pmr->s.pmr_term_value[i].mask = 0;
- memcpy(&pmr->s.pmr_term_value[i].val,
- terms[i].val, val_sz);
- memcpy(&pmr->s.pmr_term_value[i].mask,
- terms[i].mask, val_sz);
- pmr->s.pmr_term_value[i].val &= pmr->s
- .pmr_term_value[i].mask;
+ odp_pmr_create_term(&pmr->s.pmr_term_value[i], &terms[i]);
count++;
}
*pmr_set_id = id;
diff --git a/test/validation/classification/odp_classification_basic.c b/test/validation/classification/odp_classification_basic.c
index 8eb3687d..20c157f4 100644
--- a/test/validation/classification/odp_classification_basic.c
+++ b/test/validation/classification/odp_classification_basic.c
@@ -40,9 +40,16 @@ void classification_test_create_pmr_match(void)
odp_pmr_t pmr;
uint16_t val;
uint16_t mask;
+ odp_pmr_match_t match;
+
val = 1024;
mask = 0xffff;
- pmr = odp_pmr_create(ODP_PMR_TCP_SPORT, &val, &mask, sizeof(val));
+ match.term = ODP_PMR_TCP_SPORT;
+ match.val = &val;
+ match.mask = &mask;
+ match.val_sz = sizeof(val);
+
+ pmr = odp_pmr_create(&match);
CU_ASSERT(pmr != ODP_PMR_INVAL);
CU_ASSERT(odp_pmr_to_u64(pmr) != odp_pmr_to_u64(ODP_PMR_INVAL));
odp_pmr_destroy(pmr);
@@ -54,9 +61,16 @@ void classification_test_destroy_pmr(void)
uint16_t val;
uint16_t mask;
int retval;
+ odp_pmr_match_t match;
+
val = 1024;
mask = 0xffff;
- pmr = odp_pmr_create(ODP_PMR_TCP_SPORT, &val, &mask, sizeof(val));
+ match.term = ODP_PMR_TCP_SPORT;
+ match.val = &val;
+ match.mask = &mask;
+ match.val_sz = sizeof(val);
+
+ pmr = odp_pmr_create(&match);
retval = odp_pmr_destroy(pmr);
CU_ASSERT(retval == 0);
retval = odp_pmr_destroy(ODP_PMR_INVAL);
diff --git a/test/validation/classification/odp_classification_tests.c b/test/validation/classification/odp_classification_tests.c
index d002311d..229b814f 100644
--- a/test/validation/classification/odp_classification_tests.c
+++ b/test/validation/classification/odp_classification_tests.c
@@ -384,6 +384,7 @@ void configure_cls_pmr_chain(void)
char queuename[ODP_QUEUE_NAME_LEN];
uint32_t addr;
uint32_t mask;
+ odp_pmr_match_t match;
sprintf(cosname, "SrcCos");
cos_list[CLS_PMR_CHAIN_SRC] = odp_cos_create(cosname);
@@ -424,14 +425,20 @@ void configure_cls_pmr_chain(void)
CU_ASSERT(retval == 0);
parse_ipv4_string(CLS_PMR_CHAIN_SADDR, &addr, &mask);
- pmr_list[CLS_PMR_CHAIN_SRC] = odp_pmr_create(ODP_PMR_SIP_ADDR, &addr,
- &mask, sizeof(addr));
+ match.term = ODP_PMR_SIP_ADDR;
+ match.val = &addr;
+ match.mask = &mask;
+ match.val_sz = sizeof(addr);
+ pmr_list[CLS_PMR_CHAIN_SRC] = odp_pmr_create(&match);
CU_ASSERT_FATAL(pmr_list[CLS_PMR_CHAIN_SRC] != ODP_PMR_INVAL);
val = CLS_PMR_CHAIN_SPORT;
maskport = 0xffff;
- pmr_list[CLS_PMR_CHAIN_DST] = odp_pmr_create(ODP_PMR_UDP_SPORT, &val,
- &maskport, sizeof(val));
+ match.term = ODP_PMR_UDP_SPORT;
+ match.val = &val;
+ match.mask = &maskport;
+ match.val_sz = sizeof(val);
+ pmr_list[CLS_PMR_CHAIN_DST] = odp_pmr_create(&match);
CU_ASSERT_FATAL(pmr_list[CLS_PMR_CHAIN_DST] != ODP_PMR_INVAL);
retval = odp_pktio_pmr_cos(pmr_list[CLS_PMR_CHAIN_SRC], pktio_loop,
@@ -681,14 +688,19 @@ void configure_pmr_cos(void)
uint16_t val;
uint16_t mask;
int retval;
- val = CLS_PMR_SPORT;
- mask = 0xffff;
+ odp_pmr_match_t match;
odp_queue_param_t qparam;
char cosname[ODP_COS_NAME_LEN];
char queuename[ODP_QUEUE_NAME_LEN];
- pmr_list[CLS_PMR] = odp_pmr_create(ODP_PMR_UDP_SPORT, &val,
- &mask, sizeof(val));
+ val = CLS_PMR_SPORT;
+ mask = 0xffff;
+ match.term = ODP_PMR_UDP_SPORT;
+ match.val = &val;
+ match.mask = &mask;
+ match.val_sz = sizeof(val);
+
+ pmr_list[CLS_PMR] = odp_pmr_create(&match);
CU_ASSERT(pmr_list[CLS_PMR] != ODP_PMR_INVAL);
sprintf(cosname, "PMR_CoS");