policer: use enum types
Make the policer action enum packed and use it in the policer code.
Use other policer enums where applicable.
Type: improvement
Signed-off-by: Brian Russell <brian@graphiant.com>
Change-Id: I32f9735942af8bca3160b9ef8a75f605d9aba5fa
diff --git a/src/vat/api_format.c b/src/vat/api_format.c
index b16f664..a59544a 100644
--- a/src/vat/api_format.c
+++ b/src/vat/api_format.c
@@ -11652,11 +11652,14 @@
mp->rate_type = rate_type;
mp->round_type = round_type;
mp->type = type;
- mp->conform_action.type = conform_action.action_type;
+ mp->conform_action.type =
+ (vl_api_sse2_qos_action_type_t) conform_action.action_type;
mp->conform_action.dscp = conform_action.dscp;
- mp->exceed_action.type = exceed_action.action_type;
+ mp->exceed_action.type =
+ (vl_api_sse2_qos_action_type_t) exceed_action.action_type;
mp->exceed_action.dscp = exceed_action.dscp;
- mp->violate_action.type = violate_action.action_type;
+ mp->violate_action.type =
+ (vl_api_sse2_qos_action_type_t) violate_action.action_type;
mp->violate_action.dscp = violate_action.dscp;
mp->color_aware = color_aware;
diff --git a/src/vnet/policer/police.h b/src/vnet/policer/police.h
index 6027845..7867a2e 100644
--- a/src/vnet/policer/police.h
+++ b/src/vnet/policer/police.h
@@ -24,6 +24,13 @@
#define NUM_POLICE_RESULTS 3
+typedef enum
+{
+ QOS_ACTION_DROP = 0,
+ QOS_ACTION_TRANSMIT,
+ QOS_ACTION_MARK_AND_TRANSMIT
+} __clib_packed qos_action_type_en;
+
// This is the hardware representation of the policer.
// To be multithread-safe, the policer is accessed through a spin-lock
// on the lock field. (For a policer update operation, 24B needs to be
@@ -70,7 +77,7 @@
u32 single_rate; // 1 = single rate policer, 0 = two rate policer
u32 color_aware; // for hierarchical policing
u32 scale; // power-of-2 shift amount for lower rates
- u8 action[3];
+ qos_action_type_en action[3];
ip_dscp_t mark_dscp[3];
u8 pad[2];
diff --git a/src/vnet/policer/police_inlines.h b/src/vnet/policer/police_inlines.h
index f0b871a..f9378c7 100644
--- a/src/vnet/policer/police_inlines.h
+++ b/src/vnet/policer/police_inlines.h
@@ -62,7 +62,7 @@
u64 time_in_policer_periods,
policer_result_e packet_color)
{
- u8 act;
+ qos_action_type_en act;
u32 len;
u32 col;
policer_read_response_type_st *pol;
diff --git a/src/vnet/policer/policer_api.c b/src/vnet/policer/policer_api.c
index 855ebad..fb66667 100644
--- a/src/vnet/policer/policer_api.c
+++ b/src/vnet/policer/policer_api.c
@@ -61,9 +61,9 @@
vec_terminate_c_string (name);
clib_memset (&cfg, 0, sizeof (cfg));
- cfg.rfc = mp->type;
- cfg.rnd_type = mp->round_type;
- cfg.rate_type = mp->rate_type;
+ cfg.rfc = (qos_policer_type_en) mp->type;
+ cfg.rnd_type = (qos_round_type_en) mp->round_type;
+ cfg.rate_type = (qos_rate_type_en) mp->rate_type;
cfg.rb.kbps.cir_kbps = ntohl (mp->cir);
cfg.rb.kbps.eir_kbps = ntohl (mp->eir);
cfg.rb.kbps.cb_bytes = clib_net_to_host_u64 (mp->cb);
@@ -110,9 +110,9 @@
mp->eir = htonl (config->rb.kbps.eir_kbps);
mp->cb = clib_host_to_net_u64 (config->rb.kbps.cb_bytes);
mp->eb = clib_host_to_net_u64 (config->rb.kbps.eb_bytes);
- mp->rate_type = config->rate_type;
- mp->round_type = config->rnd_type;
- mp->type = config->rfc;
+ mp->rate_type = (vl_api_sse2_qos_rate_type_t) config->rate_type;
+ mp->round_type = (vl_api_sse2_qos_round_type_t) config->rnd_type;
+ mp->type = (vl_api_sse2_qos_policer_type_t) config->rfc;
mp->conform_action.type =
(vl_api_sse2_qos_action_type_t) config->conform_action.action_type;
mp->conform_action.dscp = config->conform_action.dscp;
diff --git a/src/vnet/policer/xlate.c b/src/vnet/policer/xlate.c
index 2ef9922..1b6015d 100644
--- a/src/vnet/policer/xlate.c
+++ b/src/vnet/policer/xlate.c
@@ -256,8 +256,7 @@
*/
numer = (u64) (cfg->rb.kbps.cir_kbps);
denom = (u64) (8 * QOS_POL_TICKS_PER_SEC) / 1000;
- rc = qos_pol_round (numer, denom, &rnd_value,
- (qos_round_type_en) cfg->rnd_type);
+ rc = qos_pol_round (numer, denom, &rnd_value, cfg->rnd_type);
if (rc != 0)
{
QOS_DEBUG_ERROR ("Unable to convert CIR to bytes/tick format");
@@ -267,8 +266,7 @@
cir_hw = (u32) rnd_value;
numer = (u64) (cfg->rb.kbps.eir_kbps);
- rc = qos_pol_round (numer, denom, &rnd_value,
- (qos_round_type_en) cfg->rnd_type);
+ rc = qos_pol_round (numer, denom, &rnd_value, cfg->rnd_type);
if (rc != 0)
{
QOS_DEBUG_ERROR ("Unable to convert EIR to bytes/tick format");
@@ -390,8 +388,7 @@
*/
denom = (u64) ((QOS_POL_TICKS_PER_SEC * 8) / 1000);
numer = (u64) (cfg->rb.kbps.cir_kbps);
- rc = qos_pol_round (numer, denom, &rnd_value,
- (qos_round_type_en) cfg->rnd_type);
+ rc = qos_pol_round (numer, denom, &rnd_value, cfg->rnd_type);
if (rc != 0)
{
QOS_DEBUG_ERROR ("Rounding error, rate: %d kbps, rounding_type: %d",
@@ -427,8 +424,7 @@
}
numer = (u64) eir_kbps;
- rc = qos_pol_round (numer, denom, &rnd_value,
- (qos_round_type_en) cfg->rnd_type);
+ rc = qos_pol_round (numer, denom, &rnd_value, cfg->rnd_type);
if (rc != 0)
{
QOS_DEBUG_ERROR ("Rounding error, rate: %d kbps, rounding_type: %d",
@@ -471,24 +467,22 @@
}
else
{
- qos_convert_value_to_exp_mant_fmt (
- hi_rate, (u16) QOS_POL_RATE_EXP_MAX, (u16) QOS_POL_AVG_RATE_MANT_MAX,
- (qos_round_type_en) cfg->rnd_type, &exp, &hi_mant);
+ qos_convert_value_to_exp_mant_fmt (hi_rate, (u16) QOS_POL_RATE_EXP_MAX,
+ (u16) QOS_POL_AVG_RATE_MANT_MAX,
+ cfg->rnd_type, &exp, &hi_mant);
}
denom = (1ULL << exp);
if (hi_rate == eir_hw)
{
hw->peak_rate_man = (u16) hi_mant;
- rc = qos_pol_round ((u64) cir_hw, denom, &rnd_value,
- (qos_round_type_en) cfg->rnd_type);
+ rc = qos_pol_round ((u64) cir_hw, denom, &rnd_value, cfg->rnd_type);
hw->avg_rate_man = (u16) rnd_value;
}
else
{
hw->avg_rate_man = (u16) hi_mant;
- rc = qos_pol_round ((u64) eir_hw, denom, &rnd_value,
- (qos_round_type_en) cfg->rnd_type);
+ rc = qos_pol_round ((u64) eir_hw, denom, &rnd_value, cfg->rnd_type);
hw->peak_rate_man = (u16) rnd_value;
}
if (rc != 0)
diff --git a/src/vnet/policer/xlate.h b/src/vnet/policer/xlate.h
index 101c070..46e58bd 100644
--- a/src/vnet/policer/xlate.h
+++ b/src/vnet/policer/xlate.h
@@ -35,7 +35,7 @@
QOS_POLICER_TYPE_2R3C_RFC_4115 = 3,
QOS_POLICER_TYPE_2R3C_RFC_MEF5CF1 = 4,
QOS_POLICER_TYPE_MAX
-} qos_policer_type_en;
+} __clib_packed qos_policer_type_en;
/*
* edt: * enum
@@ -47,7 +47,7 @@
QOS_ROUND_TO_UP,
QOS_ROUND_TO_DOWN,
QOS_ROUND_INVALID
-} qos_round_type_en;
+} __clib_packed qos_round_type_en;
/*
* edt: * enum
@@ -64,18 +64,7 @@
QOS_RATE_KBPS = 0,
QOS_RATE_PPS,
QOS_RATE_INVALID
-} qos_rate_type_en;
-
-/*
- * edt: * enum
- * Defines type of policer actions.
- */
-typedef enum
-{
- QOS_ACTION_DROP = 0,
- QOS_ACTION_TRANSMIT,
- QOS_ACTION_MARK_AND_TRANSMIT
-} qos_action_type_en;
+} __clib_packed qos_rate_type_en;
/*
* edt * struct qos_pol_action_params_st
@@ -88,7 +77,7 @@
*/
typedef struct qos_pol_action_params_st_
{
- u8 action_type;
+ qos_action_type_en action_type;
ip_dscp_t dscp;
} qos_pol_action_params_st;
@@ -142,9 +131,9 @@
u64 eb_ms;
} pps;
} rb; /* rate burst config */
- u8 rate_type; /* qos_rate_type_en */
- u8 rnd_type; /* qos_round_type_en */
- u8 rfc; /* qos_policer_type_en */
+ qos_rate_type_en rate_type;
+ qos_round_type_en rnd_type;
+ qos_policer_type_en rfc;
u8 color_aware;
u8 overwrite_bucket; /* for debugging purposes */
u32 current_bucket; /* for debugging purposes */