X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fip%2Fip_punt_drop.h;h=11b7ad6c8958d4868efb31981f37fe10b36004f2;hb=7cd35f5d688d9e3bddf66602655274dae944b086;hp=2fc1140a0bf7b25378e7abc18159922804618e98;hpb=baebb22c877d98c891d4d7a20ae23dc07f918edd;p=vpp.git diff --git a/src/vnet/ip/ip_punt_drop.h b/src/vnet/ip/ip_punt_drop.h index 2fc1140a0bf..11b7ad6c895 100644 --- a/src/vnet/ip/ip_punt_drop.h +++ b/src/vnet/ip/ip_punt_drop.h @@ -33,6 +33,7 @@ typedef struct 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; @@ -102,45 +103,52 @@ ip_punt_policer (vlib_main_t * vm, 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); @@ -162,27 +170,32 @@ ip_punt_policer (vlib_main_t * vm, 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); } @@ -254,10 +267,9 @@ typedef struct ip4_punt_redirect_trace_t_ /** * 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, @@ -336,6 +348,8 @@ ip_punt_redirect (vlib_main_t * vm, 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;