aboutsummaryrefslogtreecommitdiffstats
path: root/vnet/vnet/policer/policer.c
diff options
context:
space:
mode:
authorMatus Fabian <matfabia@cisco.com>2016-05-31 07:33:29 -0700
committerDamjan Marion <dmarion.lists@gmail.com>2016-07-12 15:12:58 +0000
commit4ac74c9599c73510900c18ff4c86ca390993adac (patch)
treee02baf9178ddad4f1cf810f04c33af1c2fd33f42 /vnet/vnet/policer/policer.c
parent41da02d96ba145a1778335391b8af7bbd1b4d6e6 (diff)
policer action
JIRA: VPP-90 Policer allows you to specify the action to be taken on a packet: conform-action (green color) exceed-action (yellow color) violate-action (red color) Action to take on packets: drop - drops the packet transmit - transmits the packet, the packet is not altered mark-and-transmit <DSCP> - sets the DSCP value and transmits the packet Change-Id: I59c037e55e7e2a9fc9b9752e92426f3977f5587b Signed-off-by: Matus Fabian <matfabia@cisco.com>
Diffstat (limited to 'vnet/vnet/policer/policer.c')
-rw-r--r--vnet/vnet/policer/policer.c87
1 files changed, 86 insertions, 1 deletions
diff --git a/vnet/vnet/policer/policer.c b/vnet/vnet/policer/policer.c
index 9e98de17cc8..8ffa967bd48 100644
--- a/vnet/vnet/policer/policer.c
+++ b/vnet/vnet/policer/policer.c
@@ -140,6 +140,38 @@ static u8 * format_policer_type (u8 * s, va_list * va)
return s;
}
+static u8 * format_dscp (u8 * s, va_list * va)
+{
+ u32 i = va_arg (*va, u32);
+ char * t = 0;
+
+ switch (i) {
+ #define _(v,f,str) case VNET_DSCP_##f: t = str; break;
+ foreach_vnet_dscp
+ #undef _
+ default:
+ return format (s, "ILLEGAL");
+ }
+ s = format (s, "%s", t);
+ return s;
+}
+
+static u8 * format_policer_action_type (u8 * s, va_list * va)
+{
+ sse2_qos_pol_action_params_st * a
+ = va_arg (*va, sse2_qos_pol_action_params_st *);
+
+ if (a->action_type == SSE2_QOS_ACTION_DROP)
+ s = format (s, "drop");
+ else if (a->action_type == SSE2_QOS_ACTION_TRANSMIT)
+ s = format (s, "transmit");
+ else if (a->action_type == SSE2_QOS_ACTION_MARK_AND_TRANSMIT)
+ s = format (s, "mark-and-transmit %U", format_dscp, a->dscp);
+ else
+ s = format (s, "ILLEGAL");
+ return s;
+}
+
u8 * format_policer_config (u8 * s, va_list * va)
{
sse2_qos_pol_cfg_params_st * c
@@ -154,6 +186,10 @@ u8 * format_policer_config (u8 * s, va_list * va)
s = format (s, "rate type %U, round type %U\n",
format_policer_rate_type, c,
format_policer_round_type, c);
+ s = format (s, "conform action %U, exceed action %U, violate action %U\n",
+ format_policer_action_type, &c->conform_action,
+ format_policer_action_type, &c->exceed_action,
+ format_policer_action_type, &c->violate_action);
return s;
}
@@ -263,6 +299,54 @@ unformat_policer_eb (unformat_input_t * input, va_list * va)
return 0;
}
+static uword
+unformat_dscp (unformat_input_t * input, va_list * va)
+{
+ u8 * r = va_arg (*va, u8 *);
+
+ if (0) ;
+#define _(v,f,str) else if (unformat (input, str)) *r = VNET_DSCP_##f;
+ foreach_vnet_dscp
+#undef _
+ else
+ return 0;
+ return 1;
+}
+
+static uword
+unformat_policer_action_type (unformat_input_t * input, va_list * va)
+{
+ sse2_qos_pol_action_params_st * a
+ = va_arg (*va, sse2_qos_pol_action_params_st *);
+
+ if (unformat (input, "drop"))
+ a->action_type = SSE2_QOS_ACTION_DROP;
+ else if (unformat (input, "transmit"))
+ a->action_type = SSE2_QOS_ACTION_TRANSMIT;
+ else if (unformat (input, "mark-and-transmit %U", unformat_dscp, &a->dscp))
+ a->action_type = SSE2_QOS_ACTION_MARK_AND_TRANSMIT;
+ else
+ return 0;
+ return 1;
+}
+
+static uword
+unformat_policer_action (unformat_input_t * input, va_list * va)
+{
+ sse2_qos_pol_cfg_params_st * c
+ = va_arg (*va, sse2_qos_pol_cfg_params_st *);
+
+ if (unformat (input, "conform-action %U", unformat_policer_action_type,
+ &c->conform_action))
+ return 1;
+ else if (unformat (input, "exceed-action %U", unformat_policer_action_type,
+ &c->exceed_action))
+ return 1;
+ else if (unformat (input, "violate-action %U", unformat_policer_action_type,
+ &c->violate_action))
+ return 1;
+ return 0;
+}
#define foreach_config_param \
_(eb) \
@@ -271,7 +355,8 @@ _(eir) \
_(cir) \
_(rate_type) \
_(round_type) \
-_(type)
+_(type) \
+_(action)
static clib_error_t *
configure_policer_command_fn (vlib_main_t * vm,