From fc8a10d8527a0715bee3ed25a3bb3115b165c3c0 Mon Sep 17 00:00:00 2001 From: Intel Date: Wed, 18 Sep 2013 12:00:00 +0200 Subject: [PATCH] examples/qos_meter: add color policy Signed-off-by: Intel --- examples/qos_meter/main.c | 36 ++++++++++++++++++++++++------------ examples/qos_meter/main.h | 14 ++++++++++++++ 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/examples/qos_meter/main.c b/examples/qos_meter/main.c index 776d9418c6..b94d55d4fa 100755 --- a/examples/qos_meter/main.c +++ b/examples/qos_meter/main.c @@ -166,19 +166,30 @@ app_configure_flow_table(void) } static inline void -app_pkt_handle(struct rte_mbuf *pkt, uint64_t time) +app_set_pkt_color(uint8_t *pkt_data, enum policer_action color) { - uint8_t color; + pkt_data[APP_PKT_COLOR_POS] = (uint8_t)color; +} +static inline int +app_pkt_handle(struct rte_mbuf *pkt, uint64_t time) +{ + uint8_t input_color, output_color; uint8_t *pkt_data = rte_pktmbuf_mtod(pkt, uint8_t *); uint32_t pkt_len = rte_pktmbuf_pkt_len(pkt) - sizeof(struct ether_hdr); uint8_t flow_id = (uint8_t)(pkt_data[APP_PKT_FLOW_POS] & (APP_FLOWS_MAX - 1)); - color = pkt_data[APP_PKT_COLOR_POS]; + input_color = pkt_data[APP_PKT_COLOR_POS]; + enum policer_action action; /* color input is not used for blind modes */ - color = (uint8_t) FUNC_METER(&app_flows[flow_id], time, pkt_len, - (enum rte_meter_color) color); - pkt_data[APP_PKT_COLOR_POS] = color; + output_color = (uint8_t) FUNC_METER(&app_flows[flow_id], time, pkt_len, + (enum rte_meter_color) input_color); + + /* Apply policing and set the output color */ + action = policer_table[input_color][output_color]; + app_set_pkt_color(pkt_data, action); + + return action; } @@ -229,12 +240,13 @@ main_loop(__attribute__((unused)) void *dummy) for (i = 0; i < nb_rx; i ++) { struct rte_mbuf *pkt = pkts_rx[i]; - /* Handle current packet*/ - app_pkt_handle(pkt, current_time); - - /* Write current packet in the output buffer */ - pkts_tx[pkts_tx_len] = pkt; - pkts_tx_len ++; + /* Handle current packet */ + if (app_pkt_handle(pkt, current_time) == DROP) + rte_pktmbuf_free(pkt); + else { + pkts_tx[pkts_tx_len] = pkt; + pkts_tx_len ++; + } /* Write packets from output buffer to NIC TX when full burst is available */ if (unlikely(pkts_tx_len == PKT_TX_BURST_MAX)) { diff --git a/examples/qos_meter/main.h b/examples/qos_meter/main.h index a9ffe49eca..6af3df219e 100755 --- a/examples/qos_meter/main.h +++ b/examples/qos_meter/main.h @@ -34,6 +34,20 @@ #ifndef _MAIN_H_ #define _MAIN_H_ +enum policer_action { + GREEN = e_RTE_METER_GREEN, + YELLOW = e_RTE_METER_YELLOW, + RED = e_RTE_METER_RED, + DROP = 3, +}; + +enum policer_action policer_table[e_RTE_METER_COLORS][e_RTE_METER_COLORS] = +{ + { GREEN, RED, RED}, + { DROP, YELLOW, RED}, + { DROP, DROP, RED} +}; + #ifdef RTE_EXEC_ENV_BAREMETAL #define MAIN _main #else -- 2.20.1