typedef struct ip_punt_policer_t_
{
u32 policer_index;
+ u32 fq_index;
} ip_punt_policer_t;
typedef enum ip_punt_policer_next_t_
{
IP_PUNT_POLICER_NEXT_DROP,
+ IP_PUNT_POLICER_NEXT_HANDOFF,
IP_PUNT_POLICER_N_NEXT,
} ip_punt_policer_next_t;
} ip_punt_policer_error_t;
extern u8 *format_ip_punt_policer_trace (u8 * s, va_list * args);
+extern vlib_node_registration_t ip4_punt_policer_node;
+extern ip_punt_policer_t ip4_punt_policer_cfg;
+extern vlib_node_registration_t ip6_punt_policer_node;
+extern ip_punt_policer_t ip6_punt_policer_cfg;
/**
* IP punt policing node function
b0 = vlib_get_buffer (vm, bi0);
b1 = vlib_get_buffer (vm, bi1);
- vnet_get_config_data (&cm->config_main,
- &b0->current_config_index, &next0, 0);
- vnet_get_config_data (&cm->config_main,
- &b1->current_config_index, &next1, 0);
-
- act0 = vnet_policer_police (vm, b0,
- policer_index,
- time_in_policer_periods,
- POLICE_CONFORM);
- act1 = vnet_policer_police (vm, b1,
- policer_index,
- time_in_policer_periods,
- POLICE_CONFORM);
-
- if (PREDICT_FALSE (act0 == SSE2_QOS_ACTION_DROP))
- {
- next0 = IP_PUNT_POLICER_NEXT_DROP;
- b0->error = node->errors[IP_PUNT_POLICER_ERROR_DROP];
- }
- if (PREDICT_FALSE (act1 == SSE2_QOS_ACTION_DROP))
- {
- next1 = IP_PUNT_POLICER_NEXT_DROP;
- b1->error = node->errors[IP_PUNT_POLICER_ERROR_DROP];
- }
+ act0 = vnet_policer_police (vm, b0, policer_index,
+ time_in_policer_periods, POLICE_CONFORM,
+ true);
+ act1 = vnet_policer_police (vm, b1, policer_index,
+ time_in_policer_periods, POLICE_CONFORM,
+ true);
- if (PREDICT_FALSE (b0->flags & VLIB_BUFFER_IS_TRACED))
+ if (PREDICT_FALSE (act0 == QOS_ACTION_HANDOFF))
{
- ip_punt_policer_trace_t *t =
- vlib_add_trace (vm, node, b0, sizeof (*t));
- t->next = next0;
- t->policer_index = policer_index;
+ next0 = next1 = IP_PUNT_POLICER_NEXT_HANDOFF;
}
- if (PREDICT_FALSE (b1->flags & VLIB_BUFFER_IS_TRACED))
+ else
{
- ip_punt_policer_trace_t *t =
- vlib_add_trace (vm, node, b1, sizeof (*t));
- t->next = next1;
- t->policer_index = policer_index;
+
+ vnet_get_config_data (&cm->config_main,
+ &b0->current_config_index, &next0, 0);
+ vnet_get_config_data (&cm->config_main,
+ &b1->current_config_index, &next1, 0);
+
+ if (PREDICT_FALSE (act0 == QOS_ACTION_DROP))
+ {
+ next0 = IP_PUNT_POLICER_NEXT_DROP;
+ b0->error = node->errors[IP_PUNT_POLICER_ERROR_DROP];
+ }
+ if (PREDICT_FALSE (act1 == QOS_ACTION_DROP))
+ {
+ next1 = IP_PUNT_POLICER_NEXT_DROP;
+ b1->error = node->errors[IP_PUNT_POLICER_ERROR_DROP];
+ }
+
+ if (PREDICT_FALSE (b0->flags & VLIB_BUFFER_IS_TRACED))
+ {
+ ip_punt_policer_trace_t *t =
+ vlib_add_trace (vm, node, b0, sizeof (*t));
+ t->next = next0;
+ t->policer_index = policer_index;
+ }
+ if (PREDICT_FALSE (b1->flags & VLIB_BUFFER_IS_TRACED))
+ {
+ ip_punt_policer_trace_t *t =
+ vlib_add_trace (vm, node, b1, sizeof (*t));
+ t->next = next1;
+ t->policer_index = policer_index;
+ }
}
+
vlib_validate_buffer_enqueue_x2 (vm, node, next_index, to_next,
n_left_to_next,
bi0, bi1, next0, next1);
b0 = vlib_get_buffer (vm, bi0);
- vnet_get_config_data (&cm->config_main,
- &b0->current_config_index, &next0, 0);
-
- act0 = vnet_policer_police (vm, b0,
- policer_index,
- time_in_policer_periods,
- POLICE_CONFORM);
- if (PREDICT_FALSE (act0 == SSE2_QOS_ACTION_DROP))
+ act0 = vnet_policer_police (vm, b0, policer_index,
+ time_in_policer_periods, POLICE_CONFORM,
+ true);
+ if (PREDICT_FALSE (act0 == QOS_ACTION_HANDOFF))
{
- next0 = IP_PUNT_POLICER_NEXT_DROP;
- b0->error = node->errors[IP_PUNT_POLICER_ERROR_DROP];
+ next0 = IP_PUNT_POLICER_NEXT_HANDOFF;
}
-
- if (PREDICT_FALSE (b0->flags & VLIB_BUFFER_IS_TRACED))
+ else
{
- ip_punt_policer_trace_t *t =
- vlib_add_trace (vm, node, b0, sizeof (*t));
- t->next = next0;
- t->policer_index = policer_index;
+ vnet_get_config_data (&cm->config_main,
+ &b0->current_config_index, &next0, 0);
+
+ if (PREDICT_FALSE (act0 == QOS_ACTION_DROP))
+ {
+ next0 = IP_PUNT_POLICER_NEXT_DROP;
+ b0->error = node->errors[IP_PUNT_POLICER_ERROR_DROP];
+ }
+
+ if (PREDICT_FALSE (b0->flags & VLIB_BUFFER_IS_TRACED))
+ {
+ ip_punt_policer_trace_t *t =
+ vlib_add_trace (vm, node, b0, sizeof (*t));
+ t->next = next0;
+ t->policer_index = policer_index;
+ }
}
-
vlib_validate_buffer_enqueue_x1 (vm, node, next_index, to_next,
n_left_to_next, bi0, next0);
}
/**
* Add a punt redirect entry
*/
-extern void ip_punt_redirect_add (fib_protocol_t fproto,
- u32 rx_sw_if_index,
+extern void ip_punt_redirect_add (fib_protocol_t fproto, u32 rx_sw_if_index,
fib_forward_chain_type_t ct,
- fib_route_path_t * rpaths);
+ const fib_route_path_t *rpaths);
extern void ip_punt_redirect_del (fib_protocol_t fproto, u32 rx_sw_if_index);
extern index_t ip_punt_redirect_find (fib_protocol_t fproto,
if (PREDICT_TRUE (INDEX_INVALID != rrxi0))
{
+ /* prevent ttl decrement on forward */
+ b0->flags |= VNET_BUFFER_F_LOCALLY_ORIGINATED;
rrx0 = ip_punt_redirect_get (rrxi0);
vnet_buffer (b0)->ip.adj_index[VLIB_TX] = rrx0->dpo.dpoi_index;
next0 = rrx0->dpo.dpoi_next_node;