Signed-off-by: Cristian Dumitrescu <cristian.dumitre...@intel.com>
---
 lib/librte_meter/rte_meter.c           |  88 ++++++++++-------
 lib/librte_meter/rte_meter.h           | 170 ++++++++++++++++++++++-----------
 lib/librte_meter/rte_meter_version.map |   8 ++
 3 files changed, 174 insertions(+), 92 deletions(-)

diff --git a/lib/librte_meter/rte_meter.c b/lib/librte_meter/rte_meter.c
index 5e2dadb..6f3fa59 100644
--- a/lib/librte_meter/rte_meter.c
+++ b/lib/librte_meter/rte_meter.c
@@ -1,7 +1,7 @@
 /*-
  *   BSD LICENSE
  *
- *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
+ *   Copyright(c) 2010-2017 Intel Corporation. All rights reserved.
  *   All rights reserved.
  *
  *   Redistribution and use in source and binary forms, with or without
@@ -60,61 +60,75 @@ rte_meter_get_tb_params(uint64_t hz, uint64_t rate, 
uint64_t *tb_period, uint64_
 }
 
 int
-rte_meter_srtcm_config(struct rte_meter_srtcm *m, struct 
rte_meter_srtcm_params *params)
+rte_meter_srtcm_profile_config(struct rte_meter_srtcm_profile *p, struct 
rte_meter_srtcm_params *params)
 {
-       uint64_t hz;
+       uint64_t hz = rte_get_tsc_hz();
 
        /* Check input parameters */
-       if ((m == NULL) || (params == NULL)) {
-               return -1;
-       }
+       if ((p == NULL) ||
+               (params == NULL) ||
+               (params->cir == 0) ||
+               ((params->cbs == 0) && (params->ebs == 0)))
+               return -EINVAL;
 
-       if ((params->cir == 0) || ((params->cbs == 0) && (params->ebs == 0))) {
-               return -2;
-       }
+       /* Initialize srTCM run-time structure */
+       p->cbs = params->cbs;
+       p->ebs = params->ebs;
+       rte_meter_get_tb_params(hz, params->cir, &p->cir_period, 
&p->cir_bytes_per_period);
+
+       return 0;
+}
+
+int
+rte_meter_srtcm_config(struct rte_meter_srtcm *m, struct 
rte_meter_srtcm_profile *p)
+{
+       /* Check input parameters */
+       if ((m == NULL) || (p == NULL))
+               return -EINVAL;
 
        /* Initialize srTCM run-time structure */
-       hz = rte_get_tsc_hz();
        m->time = rte_get_tsc_cycles();
-       m->tc = m->cbs = params->cbs;
-       m->te = m->ebs = params->ebs;
-       rte_meter_get_tb_params(hz, params->cir, &m->cir_period, 
&m->cir_bytes_per_period);
-
-       RTE_LOG(INFO, METER, "Low level srTCM config: \n"
-               "\tCIR period = %" PRIu64 ", CIR bytes per period = %" PRIu64 
"\n",
-               m->cir_period, m->cir_bytes_per_period);
+       m->tc = p->cbs;
+       m->te = p->ebs;
 
        return 0;
 }
 
 int
-rte_meter_trtcm_config(struct rte_meter_trtcm *m, struct 
rte_meter_trtcm_params *params)
+rte_meter_trtcm_profile_config(struct rte_meter_trtcm_profile *p, struct 
rte_meter_trtcm_params *params)
 {
-       uint64_t hz;
+       uint64_t hz = rte_get_tsc_hz();
 
        /* Check input parameters */
-       if ((m == NULL) || (params == NULL)) {
-               return -1;
-       }
+       if ((p == NULL) ||
+               (params == NULL) ||
+               (params->cir == 0) ||
+               (params->pir == 0) ||
+               (params->pir < params->cir) ||
+               (params->cbs == 0) ||
+               (params->pbs == 0))
+               return -EINVAL;
 
-       if ((params->cir == 0) || (params->pir == 0) || (params->pir < 
params->cir) ||
-               (params->cbs == 0) || (params->pbs == 0)) {
-               return -2;
-       }
+       /* Initialize trTCM run-time structure */
+       p->cbs = params->cbs;
+       p->pbs = params->pbs;
+       rte_meter_get_tb_params(hz, params->cir, &p->cir_period, 
&p->cir_bytes_per_period);
+       rte_meter_get_tb_params(hz, params->pir, &p->pir_period, 
&p->pir_bytes_per_period);
+
+       return 0;
+}
+
+int
+rte_meter_trtcm_config(struct rte_meter_trtcm *m, struct 
rte_meter_trtcm_profile *p)
+{
+       /* Check input parameters */
+       if ((m == NULL) || (p == NULL))
+               return -EINVAL;
 
        /* Initialize trTCM run-time structure */
-       hz = rte_get_tsc_hz();
        m->time_tc = m->time_tp = rte_get_tsc_cycles();
-       m->tc = m->cbs = params->cbs;
-       m->tp = m->pbs = params->pbs;
-       rte_meter_get_tb_params(hz, params->cir, &m->cir_period, 
&m->cir_bytes_per_period);
-       rte_meter_get_tb_params(hz, params->pir, &m->pir_period, 
&m->pir_bytes_per_period);
-
-       RTE_LOG(INFO, METER, "Low level trTCM config: \n"
-               "\tCIR period = %" PRIu64 ", CIR bytes per period = %" PRIu64 
"\n"
-               "\tPIR period = %" PRIu64 ", PIR bytes per period = %" PRIu64 
"\n",
-               m->cir_period, m->cir_bytes_per_period,
-               m->pir_period, m->pir_bytes_per_period);
+       m->tc = p->cbs;
+       m->tp = p->pbs;
 
        return 0;
 }
diff --git a/lib/librte_meter/rte_meter.h b/lib/librte_meter/rte_meter.h
index 2ab7184..c4bf9fd 100644
--- a/lib/librte_meter/rte_meter.h
+++ b/lib/librte_meter/rte_meter.h
@@ -1,7 +1,7 @@
 /*-
  *   BSD LICENSE
  *
- *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
+ *   Copyright(c) 2010-2017 Intel Corporation. All rights reserved.
  *   All rights reserved.
  *
  *   Redistribution and use in source and binary forms, with or without
@@ -82,6 +82,18 @@ struct rte_meter_trtcm_params {
        uint64_t pbs; /**< Peak Burst Size (PBS). Measured in bytes. */
 };
 
+/**
+ * Internal data structure storing the srTCM configuration profile. Typically
+ * shared by multiple srTCM objects.
+ */
+struct rte_meter_srtcm_profile;
+
+/**
+  * Internal data structure storing the trTCM configuration profile. Typically
+  * shared by multiple trTCM objects.
+  */
+struct rte_meter_trtcm_profile;
+
 /** Internal data structure storing the srTCM run-time context per metered 
traffic flow. */
 struct rte_meter_srtcm;
 
@@ -89,38 +101,66 @@ struct rte_meter_srtcm;
 struct rte_meter_trtcm;
 
 /**
+ * srTCM profile configuration
+ *
+ * @param p
+ *    Pointer to pre-allocated srTCM profile data structure
+ * @param params
+ *    srTCM profile parameters
+ * @return
+ *    0 upon success, error code otherwise
+ */
+int rte_meter_srtcm_profile_config(struct rte_meter_srtcm_profile *p,
+       struct rte_meter_srtcm_params *params);
+
+/**
+ * trTCM profile configuration
+ *
+ * @param p
+ *    Pointer to pre-allocated trTCM profile data structure
+ * @param params
+ *    trTCM profile parameters
+ * @return
+ *    0 upon success, error code otherwise
+ */
+int rte_meter_trtcm_profile_config(struct rte_meter_trtcm_profile *p,
+       struct rte_meter_trtcm_params *params);
+
+/**
  * srTCM configuration per metered traffic flow
  *
  * @param m
  *    Pointer to pre-allocated srTCM data structure
- * @param params
- *    User parameters per srTCM metered traffic flow
+ * @param p
+ *    srTCM profile. Needs to be valid.
  * @return
  *    0 upon success, error code otherwise
  */
 int
 rte_meter_srtcm_config(struct rte_meter_srtcm *m,
-       struct rte_meter_srtcm_params *params);
+       struct rte_meter_srtcm_profile *p);
 
 /**
  * trTCM configuration per metered traffic flow
  *
  * @param m
  *    Pointer to pre-allocated trTCM data structure
- * @param params
- *    User parameters per trTCM metered traffic flow
+ * @param p
+ *    trTCM profile. Needs to be valid.
  * @return
  *    0 upon success, error code otherwise
  */
 int
 rte_meter_trtcm_config(struct rte_meter_trtcm *m,
-       struct rte_meter_trtcm_params *params);
+       struct rte_meter_trtcm_profile *p);
 
 /**
  * srTCM color blind traffic metering
  *
  * @param m
  *    Handle to srTCM instance
+ * @param p
+ *    srTCM profile specified at srTCM object creation time
  * @param time
  *    Current CPU time stamp (measured in CPU cycles)
  * @param pkt_len
@@ -130,6 +170,7 @@ rte_meter_trtcm_config(struct rte_meter_trtcm *m,
  */
 static inline enum rte_meter_color
 rte_meter_srtcm_color_blind_check(struct rte_meter_srtcm *m,
+       struct rte_meter_srtcm_profile *p,
        uint64_t time,
        uint32_t pkt_len);
 
@@ -138,6 +179,8 @@ rte_meter_srtcm_color_blind_check(struct rte_meter_srtcm *m,
  *
  * @param m
  *    Handle to srTCM instance
+ * @param p
+ *    srTCM profile specified at srTCM object creation time
  * @param time
  *    Current CPU time stamp (measured in CPU cycles)
  * @param pkt_len
@@ -149,6 +192,7 @@ rte_meter_srtcm_color_blind_check(struct rte_meter_srtcm *m,
  */
 static inline enum rte_meter_color
 rte_meter_srtcm_color_aware_check(struct rte_meter_srtcm *m,
+       struct rte_meter_srtcm_profile *p,
        uint64_t time,
        uint32_t pkt_len,
        enum rte_meter_color pkt_color);
@@ -158,6 +202,8 @@ rte_meter_srtcm_color_aware_check(struct rte_meter_srtcm *m,
  *
  * @param m
  *    Handle to trTCM instance
+ * @param p
+ *    trTCM profile specified at trTCM object creation time
  * @param time
  *    Current CPU time stamp (measured in CPU cycles)
  * @param pkt_len
@@ -167,6 +213,7 @@ rte_meter_srtcm_color_aware_check(struct rte_meter_srtcm *m,
  */
 static inline enum rte_meter_color
 rte_meter_trtcm_color_blind_check(struct rte_meter_trtcm *m,
+       struct rte_meter_trtcm_profile *p,
        uint64_t time,
        uint32_t pkt_len);
 
@@ -175,6 +222,8 @@ rte_meter_trtcm_color_blind_check(struct rte_meter_trtcm *m,
  *
  * @param m
  *    Handle to trTCM instance
+ * @param p
+ *    trTCM profile specified at trTCM object creation time
  * @param time
  *    Current CPU time stamp (measured in CPU cycles)
  * @param pkt_len
@@ -186,6 +235,7 @@ rte_meter_trtcm_color_blind_check(struct rte_meter_trtcm *m,
  */
 static inline enum rte_meter_color
 rte_meter_trtcm_color_aware_check(struct rte_meter_trtcm *m,
+       struct rte_meter_trtcm_profile *p,
        uint64_t time,
        uint32_t pkt_len,
        enum rte_meter_color pkt_color);
@@ -195,23 +245,21 @@ rte_meter_trtcm_color_aware_check(struct rte_meter_trtcm 
*m,
  *
  ***/
 
+struct rte_meter_srtcm_profile {
+       uint64_t cbs;  /* Upper limit for C token bucket */
+       uint64_t ebs;  /* Upper limit for E token bucket */
+       uint64_t cir_period; /* Number of CPU cycles for one update of C and E 
token buckets */
+       uint64_t cir_bytes_per_period; /* Number of bytes to add to C and E 
token buckets on each update */
+};
+
 /* Internal data structure storing the srTCM run-time context per metered 
traffic flow. */
 struct rte_meter_srtcm {
        uint64_t time; /* Time of latest update of C and E token buckets */
        uint64_t tc;   /* Number of bytes currently available in the committed 
(C) token bucket */
        uint64_t te;   /* Number of bytes currently available in the excess (E) 
token bucket */
-       uint64_t cbs;  /* Upper limit for C token bucket */
-       uint64_t ebs;  /* Upper limit for E token bucket */
-       uint64_t cir_period; /* Number of CPU cycles for one update of C and E 
token buckets */
-       uint64_t cir_bytes_per_period; /* Number of bytes to add to C and E 
token buckets on each update */
 };
 
-/* Internal data structure storing the trTCM run-time context per metered 
traffic flow. */
-struct rte_meter_trtcm {
-       uint64_t time_tc; /* Time of latest update of C token bucket */
-       uint64_t time_tp; /* Time of latest update of E token bucket */
-       uint64_t tc;      /* Number of bytes currently available in the 
committed (C) token bucket */
-       uint64_t tp;      /* Number of bytes currently available in the peak 
(P) token bucket */
+struct rte_meter_trtcm_profile {
        uint64_t cbs;     /* Upper limit for C token bucket */
        uint64_t pbs;     /* Upper limit for P token bucket */
        uint64_t cir_period; /* Number of CPU cycles for one update of C token 
bucket */
@@ -220,8 +268,17 @@ struct rte_meter_trtcm {
        uint64_t pir_bytes_per_period; /* Number of bytes to add to P token 
bucket on each update */
 };
 
+/* Internal data structure storing the trTCM run-time context per metered 
traffic flow. */
+struct rte_meter_trtcm {
+       uint64_t time_tc; /* Time of latest update of C token bucket */
+       uint64_t time_tp; /* Time of latest update of E token bucket */
+       uint64_t tc;      /* Number of bytes currently available in the 
committed (C) token bucket */
+       uint64_t tp;      /* Number of bytes currently available in the peak 
(P) token bucket */
+};
+
 static inline enum rte_meter_color
 rte_meter_srtcm_color_blind_check(struct rte_meter_srtcm *m,
+       struct rte_meter_srtcm_profile *p,
        uint64_t time,
        uint32_t pkt_len)
 {
@@ -229,17 +286,17 @@ rte_meter_srtcm_color_blind_check(struct rte_meter_srtcm 
*m,
 
        /* Bucket update */
        time_diff = time - m->time;
-       n_periods = time_diff / m->cir_period;
-       m->time += n_periods * m->cir_period;
+       n_periods = time_diff / p->cir_period;
+       m->time += n_periods * p->cir_period;
 
        /* Put the tokens overflowing from tc into te bucket */
-       tc = m->tc + n_periods * m->cir_bytes_per_period;
+       tc = m->tc + n_periods * p->cir_bytes_per_period;
        te = m->te;
-       if (tc > m->cbs) {
-               te += (tc - m->cbs);
-               if (te > m->ebs)
-                       te = m->ebs;
-               tc = m->cbs;
+       if (tc > p->cbs) {
+               te += (tc - p->cbs);
+               if (te > p->ebs)
+                       te = p->ebs;
+               tc = p->cbs;
        }
 
        /* Color logic */
@@ -262,6 +319,7 @@ rte_meter_srtcm_color_blind_check(struct rte_meter_srtcm *m,
 
 static inline enum rte_meter_color
 rte_meter_srtcm_color_aware_check(struct rte_meter_srtcm *m,
+       struct rte_meter_srtcm_profile *p,
        uint64_t time,
        uint32_t pkt_len,
        enum rte_meter_color pkt_color)
@@ -270,17 +328,17 @@ rte_meter_srtcm_color_aware_check(struct rte_meter_srtcm 
*m,
 
        /* Bucket update */
        time_diff = time - m->time;
-       n_periods = time_diff / m->cir_period;
-       m->time += n_periods * m->cir_period;
+       n_periods = time_diff / p->cir_period;
+       m->time += n_periods * p->cir_period;
 
        /* Put the tokens overflowing from tc into te bucket */
-       tc = m->tc + n_periods * m->cir_bytes_per_period;
+       tc = m->tc + n_periods * p->cir_bytes_per_period;
        te = m->te;
-       if (tc > m->cbs) {
-               te += (tc - m->cbs);
-               if (te > m->ebs)
-                       te = m->ebs;
-               tc = m->cbs;
+       if (tc > p->cbs) {
+               te += (tc - p->cbs);
+               if (te > p->ebs)
+                       te = p->ebs;
+               tc = p->cbs;
        }
 
        /* Color logic */
@@ -303,6 +361,7 @@ rte_meter_srtcm_color_aware_check(struct rte_meter_srtcm *m,
 
 static inline enum rte_meter_color
 rte_meter_trtcm_color_blind_check(struct rte_meter_trtcm *m,
+       struct rte_meter_trtcm_profile *p,
        uint64_t time,
        uint32_t pkt_len)
 {
@@ -311,18 +370,18 @@ rte_meter_trtcm_color_blind_check(struct rte_meter_trtcm 
*m,
        /* Bucket update */
        time_diff_tc = time - m->time_tc;
        time_diff_tp = time - m->time_tp;
-       n_periods_tc = time_diff_tc / m->cir_period;
-       n_periods_tp = time_diff_tp / m->pir_period;
-       m->time_tc += n_periods_tc * m->cir_period;
-       m->time_tp += n_periods_tp * m->pir_period;
+       n_periods_tc = time_diff_tc / p->cir_period;
+       n_periods_tp = time_diff_tp / p->pir_period;
+       m->time_tc += n_periods_tc * p->cir_period;
+       m->time_tp += n_periods_tp * p->pir_period;
 
-       tc = m->tc + n_periods_tc * m->cir_bytes_per_period;
-       if (tc > m->cbs)
-               tc = m->cbs;
+       tc = m->tc + n_periods_tc * p->cir_bytes_per_period;
+       if (tc > p->cbs)
+               tc = p->cbs;
 
-       tp = m->tp + n_periods_tp * m->pir_bytes_per_period;
-       if (tp > m->pbs)
-               tp = m->pbs;
+       tp = m->tp + n_periods_tp * p->pir_bytes_per_period;
+       if (tp > p->pbs)
+               tp = p->pbs;
 
        /* Color logic */
        if (tp < pkt_len) {
@@ -344,6 +403,7 @@ rte_meter_trtcm_color_blind_check(struct rte_meter_trtcm *m,
 
 static inline enum rte_meter_color
 rte_meter_trtcm_color_aware_check(struct rte_meter_trtcm *m,
+       struct rte_meter_trtcm_profile *p,
        uint64_t time,
        uint32_t pkt_len,
        enum rte_meter_color pkt_color)
@@ -353,18 +413,18 @@ rte_meter_trtcm_color_aware_check(struct rte_meter_trtcm 
*m,
        /* Bucket update */
        time_diff_tc = time - m->time_tc;
        time_diff_tp = time - m->time_tp;
-       n_periods_tc = time_diff_tc / m->cir_period;
-       n_periods_tp = time_diff_tp / m->pir_period;
-       m->time_tc += n_periods_tc * m->cir_period;
-       m->time_tp += n_periods_tp * m->pir_period;
-
-       tc = m->tc + n_periods_tc * m->cir_bytes_per_period;
-       if (tc > m->cbs)
-               tc = m->cbs;
-
-       tp = m->tp + n_periods_tp * m->pir_bytes_per_period;
-       if (tp > m->pbs)
-               tp = m->pbs;
+       n_periods_tc = time_diff_tc / p->cir_period;
+       n_periods_tp = time_diff_tp / p->pir_period;
+       m->time_tc += n_periods_tc * p->cir_period;
+       m->time_tp += n_periods_tp * p->pir_period;
+
+       tc = m->tc + n_periods_tc * p->cir_bytes_per_period;
+       if (tc > p->cbs)
+               tc = p->cbs;
+
+       tp = m->tp + n_periods_tp * p->pir_bytes_per_period;
+       if (tp > p->pbs)
+               tp = p->pbs;
 
        /* Color logic */
        if ((pkt_color == e_RTE_METER_RED) || (tp < pkt_len)) {
diff --git a/lib/librte_meter/rte_meter_version.map 
b/lib/librte_meter/rte_meter_version.map
index 2fd647c..8bc8190 100644
--- a/lib/librte_meter/rte_meter_version.map
+++ b/lib/librte_meter/rte_meter_version.map
@@ -10,3 +10,11 @@ DPDK_2.0 {
 
        local: *;
 };
+
+DPDK_17.11 {
+       global:
+
+       rte_meter_srtcm_profile_config;
+       rte_meter_trtcm_profile_config;
+
+} DPDK_2.0;
-- 
2.7.4

Reply via email to