typedef enum
{
- ICMP_INPUT_NEXT_DROP,
+ ICMP_INPUT_NEXT_PUNT,
ICMP_INPUT_N_NEXT,
} icmp_input_next_t;
next0 = im->input_next_index_by_type[type0];
error0 =
- next0 == ICMP_INPUT_NEXT_DROP ? ICMP6_ERROR_UNKNOWN_TYPE : error0;
+ next0 == ICMP_INPUT_NEXT_PUNT ? ICMP6_ERROR_UNKNOWN_TYPE : error0;
/* Check code is valid for type. */
error0 =
b0->error = node->errors[error0];
- next0 = error0 != ICMP6_ERROR_NONE ? ICMP_INPUT_NEXT_DROP : next0;
+ next0 = error0 != ICMP6_ERROR_NONE ? ICMP_INPUT_NEXT_PUNT : next0;
vlib_validate_buffer_enqueue_x1 (vm, node, next_index,
to_next, n_left_to_next,
.n_next_nodes = 1,
.next_nodes = {
- [ICMP_INPUT_NEXT_DROP] = "ip6-drop",
+ [ICMP_INPUT_NEXT_PUNT] = "ip6-punt",
},
};
/* *INDENT-ON* */
org_p0 = vlib_get_buffer (vm, org_pi0);
p0 = vlib_buffer_copy_no_chain (vm, org_p0, &pi0);
- vlib_buffer_free_one (vm, org_pi0);
if (!p0 || pi0 == ~0) /* Out of buffers */
continue;
vlib_put_next_frame (vm, node, next_index, n_left_to_next);
}
+ /*
+ * push the original buffers to error-drop, so that
+ * they can get the error counters handled, then freed
+ */
+ vlib_buffer_enqueue_to_single_next (vm, node,
+ vlib_frame_vector_args (frame),
+ IP6_ICMP_ERROR_NEXT_DROP,
+ frame->n_vectors);
+
return frame->n_vectors;
}
#undef _
clib_memset (cm->input_next_index_by_type,
- ICMP_INPUT_NEXT_DROP, sizeof (cm->input_next_index_by_type));
+ ICMP_INPUT_NEXT_PUNT, sizeof (cm->input_next_index_by_type));
clib_memset (cm->max_valid_code_by_type, 0,
sizeof (cm->max_valid_code_by_type));
icmp6_register_type (vm, ICMP6_echo_request,
ip6_icmp_echo_request_node.index);
- return vlib_call_init_function (vm, ip6_neighbor_init);
+ return (NULL);
}
VLIB_INIT_FUNCTION (icmp6_init);