X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_meter%2Frte_meter.h;h=ebdc453fc9d863905da94a448112f2dd0a657471;hb=7e92cef514caab2e71f1f415375a1046c7a2377d;hp=59b1e4a65c29da7742be5375bae991708a85e8d6;hpb=1c1d4d7a923d4804f1926fc5264f9ecdd8977b04;p=dpdk.git diff --git a/lib/librte_meter/rte_meter.h b/lib/librte_meter/rte_meter.h index 59b1e4a65c..ebdc453fc9 100644 --- a/lib/librte_meter/rte_meter.h +++ b/lib/librte_meter/rte_meter.h @@ -1,34 +1,5 @@ -/*- - * BSD LICENSE - * - * Copyright(c) 2010-2013 Intel Corporation. All rights reserved. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Intel Corporation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2010-2014 Intel Corporation */ #ifndef __INCLUDE_RTE_METER_H__ @@ -123,7 +94,7 @@ rte_meter_trtcm_config(struct rte_meter_trtcm *m, * Handle to srTCM instance * @param time * Current CPU time stamp (measured in CPU cycles) - * @param pkt_length + * @param pkt_len * Length of the current IP packet (measured in bytes) * @return * Color assigned to the current IP packet @@ -140,7 +111,7 @@ rte_meter_srtcm_color_blind_check(struct rte_meter_srtcm *m, * Handle to srTCM instance * @param time * Current CPU time stamp (measured in CPU cycles) - * @param pkt_length + * @param pkt_len * Length of the current IP packet (measured in bytes) * @param pkt_color * Input color of the current IP packet @@ -150,7 +121,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, uint64_t time, - uint32_t pkt_len, + uint32_t pkt_len, enum rte_meter_color pkt_color); /** @@ -160,7 +131,7 @@ rte_meter_srtcm_color_aware_check(struct rte_meter_srtcm *m, * Handle to trTCM instance * @param time * Current CPU time stamp (measured in CPU cycles) - * @param pkt_length + * @param pkt_len * Length of the current IP packet (measured in bytes) * @return * Color assigned to the current IP packet @@ -177,7 +148,7 @@ rte_meter_trtcm_color_blind_check(struct rte_meter_trtcm *m, * Handle to trTCM instance * @param time * Current CPU time stamp (measured in CPU cycles) - * @param pkt_length + * @param pkt_len * Length of the current IP packet (measured in bytes) * @param pkt_color * Input color of the current IP packet @@ -194,7 +165,7 @@ rte_meter_trtcm_color_aware_check(struct rte_meter_trtcm *m, * Inline implementation of run-time methods * ***/ - + /* 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 */ @@ -221,38 +192,40 @@ struct rte_meter_trtcm { }; static inline enum rte_meter_color -rte_meter_srtcm_color_blind_check(struct rte_meter_srtcm *m, +rte_meter_srtcm_color_blind_check(struct rte_meter_srtcm *m, uint64_t time, uint32_t pkt_len) { uint64_t time_diff, n_periods, tc, te; - + /* Bucket update */ time_diff = time - m->time; n_periods = time_diff / m->cir_period; m->time += n_periods * m->cir_period; - + + /* Put the tokens overflowing from tc into te bucket */ tc = m->tc + n_periods * m->cir_bytes_per_period; - if (tc > m->cbs) + te = m->te; + if (tc > m->cbs) { + te += (tc - m->cbs); + if (te > m->ebs) + te = m->ebs; tc = m->cbs; - - te = m->te + n_periods * m->cir_bytes_per_period; - if (te > m->ebs) - te = m->ebs; - + } + /* Color logic */ if (tc >= pkt_len) { m->tc = tc - pkt_len; m->te = te; return e_RTE_METER_GREEN; } - + if (te >= pkt_len) { m->tc = tc; m->te = te - pkt_len; return e_RTE_METER_YELLOW; } - + m->tc = tc; m->te = te; return e_RTE_METER_RED; @@ -261,37 +234,39 @@ 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, uint64_t time, - uint32_t pkt_len, + uint32_t pkt_len, enum rte_meter_color pkt_color) { uint64_t time_diff, n_periods, tc, te; - + /* Bucket update */ time_diff = time - m->time; n_periods = time_diff / m->cir_period; m->time += n_periods * m->cir_period; - + + /* Put the tokens overflowing from tc into te bucket */ tc = m->tc + n_periods * m->cir_bytes_per_period; - if (tc > m->cbs) + te = m->te; + if (tc > m->cbs) { + te += (tc - m->cbs); + if (te > m->ebs) + te = m->ebs; tc = m->cbs; - - te = m->te + n_periods * m->cir_bytes_per_period; - if (te > m->ebs) - te = m->ebs; - + } + /* Color logic */ if ((pkt_color == e_RTE_METER_GREEN) && (tc >= pkt_len)) { m->tc = tc - pkt_len; m->te = te; return e_RTE_METER_GREEN; } - + if ((pkt_color != e_RTE_METER_RED) && (te >= pkt_len)) { m->tc = tc; m->te = te - pkt_len; return e_RTE_METER_YELLOW; } - + m->tc = tc; m->te = te; return e_RTE_METER_RED; @@ -303,7 +278,7 @@ rte_meter_trtcm_color_blind_check(struct rte_meter_trtcm *m, uint32_t pkt_len) { uint64_t time_diff_tc, time_diff_tp, n_periods_tc, n_periods_tp, tc, tp; - + /* Bucket update */ time_diff_tc = time - m->time_tc; time_diff_tp = time - m->time_tp; @@ -311,28 +286,28 @@ rte_meter_trtcm_color_blind_check(struct rte_meter_trtcm *m, 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; - + /* Color logic */ if (tp < pkt_len) { m->tc = tc; m->tp = tp; return e_RTE_METER_RED; } - + if (tc < pkt_len) { m->tc = tc; m->tp = tp - pkt_len; return e_RTE_METER_YELLOW; } - + m->tc = tc - pkt_len; m->tp = tp - pkt_len; return e_RTE_METER_GREEN; @@ -341,11 +316,11 @@ 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, uint64_t time, - uint32_t pkt_len, + uint32_t pkt_len, enum rte_meter_color pkt_color) { uint64_t time_diff_tc, time_diff_tp, n_periods_tc, n_periods_tp, tc, tp; - + /* Bucket update */ time_diff_tc = time - m->time_tc; time_diff_tp = time - m->time_tp; @@ -353,28 +328,28 @@ rte_meter_trtcm_color_aware_check(struct rte_meter_trtcm *m, 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; - + /* Color logic */ if ((pkt_color == e_RTE_METER_RED) || (tp < pkt_len)) { m->tc = tc; m->tp = tp; return e_RTE_METER_RED; } - + if ((pkt_color == e_RTE_METER_YELLOW) || (tc < pkt_len)) { m->tc = tc; m->tp = tp - pkt_len; return e_RTE_METER_YELLOW; } - + m->tc = tc - pkt_len; m->tp = tp - pkt_len; return e_RTE_METER_GREEN;