summaryrefslogtreecommitdiffstats
path: root/vnet/vnet/ip/ip4_input.c
diff options
context:
space:
mode:
Diffstat (limited to 'vnet/vnet/ip/ip4_input.c')
-rw-r--r--vnet/vnet/ip/ip4_input.c246
1 files changed, 156 insertions, 90 deletions
diff --git a/vnet/vnet/ip/ip4_input.c b/vnet/vnet/ip/ip4_input.c
index a3620de8b42..69b1e5a83d2 100644
--- a/vnet/vnet/ip/ip4_input.c
+++ b/vnet/vnet/ip/ip4_input.c
@@ -42,24 +42,26 @@
#include <vnet/ppp/ppp.h>
#include <vnet/hdlc/hdlc.h>
-typedef struct {
+typedef struct
+{
u8 packet_data[64];
} ip4_input_trace_t;
-static u8 * format_ip4_input_trace (u8 * s, va_list * va)
+static u8 *
+format_ip4_input_trace (u8 * s, va_list * va)
{
CLIB_UNUSED (vlib_main_t * vm) = va_arg (*va, vlib_main_t *);
CLIB_UNUSED (vlib_node_t * node) = va_arg (*va, vlib_node_t *);
- ip4_input_trace_t * t = va_arg (*va, ip4_input_trace_t *);
+ ip4_input_trace_t *t = va_arg (*va, ip4_input_trace_t *);
s = format (s, "%U",
- format_ip4_header,
- t->packet_data, sizeof (t->packet_data));
+ format_ip4_header, t->packet_data, sizeof (t->packet_data));
return s;
}
-typedef enum {
+typedef enum
+{
IP4_INPUT_NEXT_DROP,
IP4_INPUT_NEXT_PUNT,
IP4_INPUT_NEXT_LOOKUP,
@@ -73,17 +75,17 @@ typedef enum {
always_inline uword
ip4_input_inline (vlib_main_t * vm,
vlib_node_runtime_t * node,
- vlib_frame_t * frame,
- int verify_checksum)
+ vlib_frame_t * frame, int verify_checksum)
{
- ip4_main_t * im = &ip4_main;
- vnet_main_t * vnm = vnet_get_main();
- ip_lookup_main_t * lm = &im->lookup_main;
- u32 n_left_from, * from, * to_next;
+ ip4_main_t *im = &ip4_main;
+ vnet_main_t *vnm = vnet_get_main ();
+ ip_lookup_main_t *lm = &im->lookup_main;
+ u32 n_left_from, *from, *to_next;
ip4_input_next_t next_index;
- vlib_node_runtime_t * error_node = vlib_node_get_runtime (vm, ip4_input_node.index);
- vlib_simple_counter_main_t * cm;
- u32 cpu_index = os_get_cpu_number();
+ vlib_node_runtime_t *error_node =
+ vlib_node_get_runtime (vm, ip4_input_node.index);
+ vlib_simple_counter_main_t *cm;
+ u32 cpu_index = os_get_cpu_number ();
from = vlib_frame_vector_args (frame);
n_left_from = frame->n_vectors;
@@ -95,19 +97,18 @@ ip4_input_inline (vlib_main_t * vm,
sizeof (ip4_input_trace_t));
cm = vec_elt_at_index (vnm->interface_main.sw_if_counters,
- VNET_INTERFACE_COUNTER_IP4);
+ VNET_INTERFACE_COUNTER_IP4);
while (n_left_from > 0)
{
u32 n_left_to_next;
- vlib_get_next_frame (vm, node, next_index,
- to_next, n_left_to_next);
+ vlib_get_next_frame (vm, node, next_index, to_next, n_left_to_next);
while (n_left_from >= 4 && n_left_to_next >= 2)
{
- vlib_buffer_t * p0, * p1;
- ip4_header_t * ip0, * ip1;
+ vlib_buffer_t *p0, *p1;
+ ip4_header_t *ip0, *ip1;
u32 sw_if_index0, pi0, ip_len0, cur_len0, next0 = 0;
u32 sw_if_index1, pi1, ip_len1, cur_len1, next1 = 0;
i32 len_diff0, len_diff1;
@@ -115,7 +116,7 @@ ip4_input_inline (vlib_main_t * vm,
/* Prefetch next iteration. */
{
- vlib_buffer_t * p2, * p3;
+ vlib_buffer_t *p2, *p3;
p2 = vlib_get_buffer (vm, from[2]);
p3 = vlib_get_buffer (vm, from[3]);
@@ -143,8 +144,12 @@ ip4_input_inline (vlib_main_t * vm,
sw_if_index0 = vnet_buffer (p0)->sw_if_index[VLIB_RX];
sw_if_index1 = vnet_buffer (p1)->sw_if_index[VLIB_RX];
- arc0 = ip4_address_is_multicast (&ip0->dst_address) ? lm->mcast_feature_arc_index : lm->ucast_feature_arc_index;
- arc1 = ip4_address_is_multicast (&ip1->dst_address) ? lm->mcast_feature_arc_index : lm->ucast_feature_arc_index;
+ arc0 =
+ ip4_address_is_multicast (&ip0->dst_address) ?
+ lm->mcast_feature_arc_index : lm->ucast_feature_arc_index;
+ arc1 =
+ ip4_address_is_multicast (&ip1->dst_address) ?
+ lm->mcast_feature_arc_index : lm->ucast_feature_arc_index;
vnet_buffer (p0)->ip.adj_index[VLIB_RX] = ~0;
vnet_buffer (p1)->ip.adj_index[VLIB_RX] = ~0;
@@ -158,12 +163,20 @@ ip4_input_inline (vlib_main_t * vm,
error0 = error1 = IP4_ERROR_NONE;
/* Punt packets with options. */
- error0 = (ip0->ip_version_and_header_length & 0xf) != 5 ? IP4_ERROR_OPTIONS : error0;
- error1 = (ip1->ip_version_and_header_length & 0xf) != 5 ? IP4_ERROR_OPTIONS : error1;
+ error0 =
+ (ip0->ip_version_and_header_length & 0xf) !=
+ 5 ? IP4_ERROR_OPTIONS : error0;
+ error1 =
+ (ip1->ip_version_and_header_length & 0xf) !=
+ 5 ? IP4_ERROR_OPTIONS : error1;
/* Version != 4? Drop it. */
- error0 = (ip0->ip_version_and_header_length >> 4) != 4 ? IP4_ERROR_VERSION : error0;
- error1 = (ip1->ip_version_and_header_length >> 4) != 4 ? IP4_ERROR_VERSION : error1;
+ error0 =
+ (ip0->ip_version_and_header_length >> 4) !=
+ 4 ? IP4_ERROR_VERSION : error0;
+ error1 =
+ (ip1->ip_version_and_header_length >> 4) !=
+ 4 ? IP4_ERROR_VERSION : error1;
/* Verify header checksum. */
if (verify_checksum)
@@ -173,17 +186,31 @@ ip4_input_inline (vlib_main_t * vm,
ip4_partial_header_checksum_x1 (ip0, sum0);
ip4_partial_header_checksum_x1 (ip1, sum1);
- error0 = 0xffff != ip_csum_fold (sum0) ? IP4_ERROR_BAD_CHECKSUM : error0;
- error1 = 0xffff != ip_csum_fold (sum1) ? IP4_ERROR_BAD_CHECKSUM : error1;
+ error0 =
+ 0xffff !=
+ ip_csum_fold (sum0) ? IP4_ERROR_BAD_CHECKSUM : error0;
+ error1 =
+ 0xffff !=
+ ip_csum_fold (sum1) ? IP4_ERROR_BAD_CHECKSUM : error1;
}
/* Drop fragmentation offset 1 packets. */
- error0 = ip4_get_fragment_offset (ip0) == 1 ? IP4_ERROR_FRAGMENT_OFFSET_ONE : error0;
- error1 = ip4_get_fragment_offset (ip1) == 1 ? IP4_ERROR_FRAGMENT_OFFSET_ONE : error1;
+ error0 =
+ ip4_get_fragment_offset (ip0) ==
+ 1 ? IP4_ERROR_FRAGMENT_OFFSET_ONE : error0;
+ error1 =
+ ip4_get_fragment_offset (ip1) ==
+ 1 ? IP4_ERROR_FRAGMENT_OFFSET_ONE : error1;
/* TTL < 1? Drop it. */
- error0 = (ip0->ttl < 1 && arc0 == lm->ucast_feature_arc_index) ? IP4_ERROR_TIME_EXPIRED : error0;
- error1 = (ip1->ttl < 1 && arc1 == lm->ucast_feature_arc_index) ? IP4_ERROR_TIME_EXPIRED : error1;
+ error0 = (ip0->ttl < 1
+ && arc0 ==
+ lm->ucast_feature_arc_index) ? IP4_ERROR_TIME_EXPIRED :
+ error0;
+ error1 = (ip1->ttl < 1
+ && arc1 ==
+ lm->ucast_feature_arc_index) ? IP4_ERROR_TIME_EXPIRED :
+ error1;
/* Verify lengths. */
ip_len0 = clib_net_to_host_u16 (ip0->length);
@@ -205,33 +232,45 @@ ip4_input_inline (vlib_main_t * vm,
p0->error = error_node->errors[error0];
p1->error = error_node->errors[error1];
- if (PREDICT_FALSE(error0 != IP4_ERROR_NONE))
- {
- if (error0 == IP4_ERROR_TIME_EXPIRED) {
- icmp4_error_set_vnet_buffer(p0, ICMP4_time_exceeded,
- ICMP4_time_exceeded_ttl_exceeded_in_transit, 0);
- next0 = IP4_INPUT_NEXT_ICMP_ERROR;
- } else
- next0 = error0 != IP4_ERROR_OPTIONS ? IP4_INPUT_NEXT_DROP : IP4_INPUT_NEXT_PUNT;
- }
- if (PREDICT_FALSE(error1 != IP4_ERROR_NONE))
- {
- if (error1 == IP4_ERROR_TIME_EXPIRED) {
- icmp4_error_set_vnet_buffer(p1, ICMP4_time_exceeded,
- ICMP4_time_exceeded_ttl_exceeded_in_transit, 0);
- next1 = IP4_INPUT_NEXT_ICMP_ERROR;
- } else
- next1 = error1 != IP4_ERROR_OPTIONS ? IP4_INPUT_NEXT_DROP : IP4_INPUT_NEXT_PUNT;
- }
+ if (PREDICT_FALSE (error0 != IP4_ERROR_NONE))
+ {
+ if (error0 == IP4_ERROR_TIME_EXPIRED)
+ {
+ icmp4_error_set_vnet_buffer (p0, ICMP4_time_exceeded,
+ ICMP4_time_exceeded_ttl_exceeded_in_transit,
+ 0);
+ next0 = IP4_INPUT_NEXT_ICMP_ERROR;
+ }
+ else
+ next0 =
+ error0 !=
+ IP4_ERROR_OPTIONS ? IP4_INPUT_NEXT_DROP :
+ IP4_INPUT_NEXT_PUNT;
+ }
+ if (PREDICT_FALSE (error1 != IP4_ERROR_NONE))
+ {
+ if (error1 == IP4_ERROR_TIME_EXPIRED)
+ {
+ icmp4_error_set_vnet_buffer (p1, ICMP4_time_exceeded,
+ ICMP4_time_exceeded_ttl_exceeded_in_transit,
+ 0);
+ next1 = IP4_INPUT_NEXT_ICMP_ERROR;
+ }
+ else
+ next1 =
+ error1 !=
+ IP4_ERROR_OPTIONS ? IP4_INPUT_NEXT_DROP :
+ IP4_INPUT_NEXT_PUNT;
+ }
vlib_validate_buffer_enqueue_x2 (vm, node, next_index,
to_next, n_left_to_next,
pi0, pi1, next0, next1);
- }
+ }
while (n_left_from > 0 && n_left_to_next > 0)
{
- vlib_buffer_t * p0;
- ip4_header_t * ip0;
+ vlib_buffer_t *p0;
+ ip4_header_t *ip0;
u32 sw_if_index0, pi0, ip_len0, cur_len0, next0 = 0;
i32 len_diff0;
u8 error0, arc0;
@@ -248,7 +287,9 @@ ip4_input_inline (vlib_main_t * vm,
sw_if_index0 = vnet_buffer (p0)->sw_if_index[VLIB_RX];
- arc0 = ip4_address_is_multicast (&ip0->dst_address) ? lm->mcast_feature_arc_index : lm->ucast_feature_arc_index;
+ arc0 =
+ ip4_address_is_multicast (&ip0->dst_address) ?
+ lm->mcast_feature_arc_index : lm->ucast_feature_arc_index;
vnet_buffer (p0)->ip.adj_index[VLIB_RX] = ~0;
vnet_feature_arc_start (arc0, sw_if_index0, &next0, p0);
@@ -257,10 +298,14 @@ ip4_input_inline (vlib_main_t * vm,
error0 = IP4_ERROR_NONE;
/* Punt packets with options. */
- error0 = (ip0->ip_version_and_header_length & 0xf) != 5 ? IP4_ERROR_OPTIONS : error0;
+ error0 =
+ (ip0->ip_version_and_header_length & 0xf) !=
+ 5 ? IP4_ERROR_OPTIONS : error0;
/* Version != 4? Drop it. */
- error0 = (ip0->ip_version_and_header_length >> 4) != 4 ? IP4_ERROR_VERSION : error0;
+ error0 =
+ (ip0->ip_version_and_header_length >> 4) !=
+ 4 ? IP4_ERROR_VERSION : error0;
/* Verify header checksum. */
if (verify_checksum)
@@ -268,14 +313,21 @@ ip4_input_inline (vlib_main_t * vm,
ip_csum_t sum0;
ip4_partial_header_checksum_x1 (ip0, sum0);
- error0 = 0xffff != ip_csum_fold (sum0) ? IP4_ERROR_BAD_CHECKSUM : error0;
+ error0 =
+ 0xffff !=
+ ip_csum_fold (sum0) ? IP4_ERROR_BAD_CHECKSUM : error0;
}
/* Drop fragmentation offset 1 packets. */
- error0 = ip4_get_fragment_offset (ip0) == 1 ? IP4_ERROR_FRAGMENT_OFFSET_ONE : error0;
+ error0 =
+ ip4_get_fragment_offset (ip0) ==
+ 1 ? IP4_ERROR_FRAGMENT_OFFSET_ONE : error0;
/* TTL < 1? Drop it. */
- error0 = (ip0->ttl < 1 && arc0 == lm->ucast_feature_arc_index) ? IP4_ERROR_TIME_EXPIRED : error0;
+ error0 = (ip0->ttl < 1
+ && arc0 ==
+ lm->ucast_feature_arc_index) ? IP4_ERROR_TIME_EXPIRED :
+ error0;
/* Verify lengths. */
ip_len0 = clib_net_to_host_u16 (ip0->length);
@@ -288,15 +340,21 @@ ip4_input_inline (vlib_main_t * vm,
error0 = len_diff0 < 0 ? IP4_ERROR_BAD_LENGTH : error0;
p0->error = error_node->errors[error0];
- if (PREDICT_FALSE(error0 != IP4_ERROR_NONE))
- {
- if (error0 == IP4_ERROR_TIME_EXPIRED) {
- icmp4_error_set_vnet_buffer(p0, ICMP4_time_exceeded,
- ICMP4_time_exceeded_ttl_exceeded_in_transit, 0);
- next0 = IP4_INPUT_NEXT_ICMP_ERROR;
- } else
- next0 = error0 != IP4_ERROR_OPTIONS ? IP4_INPUT_NEXT_DROP : IP4_INPUT_NEXT_PUNT;
- }
+ if (PREDICT_FALSE (error0 != IP4_ERROR_NONE))
+ {
+ if (error0 == IP4_ERROR_TIME_EXPIRED)
+ {
+ icmp4_error_set_vnet_buffer (p0, ICMP4_time_exceeded,
+ ICMP4_time_exceeded_ttl_exceeded_in_transit,
+ 0);
+ next0 = IP4_INPUT_NEXT_ICMP_ERROR;
+ }
+ else
+ next0 =
+ error0 !=
+ IP4_ERROR_OPTIONS ? IP4_INPUT_NEXT_DROP :
+ IP4_INPUT_NEXT_PUNT;
+ }
vlib_validate_buffer_enqueue_x1 (vm, node, next_index,
to_next, n_left_to_next,
@@ -324,10 +382,10 @@ ip4_input_inline (vlib_main_t * vm,
@par Graph mechanics: buffer metadata, next index usage
@em Uses:
- - vnet_feature_config_main_t cm corresponding to each pkt's dst address unicast /
+ - vnet_feature_config_main_t cm corresponding to each pkt's dst address unicast /
multicast status.
- <code>b->current_config_index</code> corresponding to each pkt's
- rx sw_if_index.
+ rx sw_if_index.
- This sets the per-packet graph trajectory, ensuring that
each packet visits the per-interface features in order.
@@ -342,30 +400,28 @@ ip4_input_inline (vlib_main_t * vm,
<em>Next Indices:</em>
- Dispatches pkts to the (first) feature node:
<code> vnet_get_config_data (... &next0 ...); </code>
- or @c error-drop
+ or @c error-drop
*/
static uword
-ip4_input (vlib_main_t * vm,
- vlib_node_runtime_t * node,
- vlib_frame_t * frame)
+ip4_input (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame)
{
return ip4_input_inline (vm, node, frame, /* verify_checksum */ 1);
}
static uword
ip4_input_no_checksum (vlib_main_t * vm,
- vlib_node_runtime_t * node,
- vlib_frame_t * frame)
+ vlib_node_runtime_t * node, vlib_frame_t * frame)
{
return ip4_input_inline (vm, node, frame, /* verify_checksum */ 0);
}
-static char * ip4_error_strings[] = {
+static char *ip4_error_strings[] = {
#define _(sym,string) string,
foreach_ip4_error
#undef _
};
+/* *INDENT-OFF* */
VLIB_REGISTER_NODE (ip4_input_node) = {
.function = ip4_input,
.name = "ip4-input",
@@ -386,9 +442,11 @@ VLIB_REGISTER_NODE (ip4_input_node) = {
.format_buffer = format_ip4_header,
.format_trace = format_ip4_input_trace,
};
+/* *INDENT-ON* */
-VLIB_NODE_FUNCTION_MULTIARCH (ip4_input_node, ip4_input)
+VLIB_NODE_FUNCTION_MULTIARCH (ip4_input_node, ip4_input);
+/* *INDENT-OFF* */
VLIB_REGISTER_NODE (ip4_input_no_checksum_node,static) = {
.function = ip4_input_no_checksum,
.name = "ip4-input-no-checksum",
@@ -406,22 +464,22 @@ VLIB_REGISTER_NODE (ip4_input_no_checksum_node,static) = {
.format_buffer = format_ip4_header,
.format_trace = format_ip4_input_trace,
};
+/* *INDENT-ON* */
-VLIB_NODE_FUNCTION_MULTIARCH (ip4_input_no_checksum_node, ip4_input_no_checksum)
+VLIB_NODE_FUNCTION_MULTIARCH (ip4_input_no_checksum_node,
+ ip4_input_no_checksum);
-static clib_error_t * ip4_init (vlib_main_t * vm)
+static clib_error_t *
+ip4_init (vlib_main_t * vm)
{
- clib_error_t * error;
+ clib_error_t *error;
- ethernet_register_input_type (vm, ETHERNET_TYPE_IP4,
- ip4_input_node.index);
- ppp_register_input_protocol (vm, PPP_PROTOCOL_ip4,
- ip4_input_node.index);
- hdlc_register_input_protocol (vm, HDLC_PROTOCOL_ip4,
- ip4_input_node.index);
+ ethernet_register_input_type (vm, ETHERNET_TYPE_IP4, ip4_input_node.index);
+ ppp_register_input_protocol (vm, PPP_PROTOCOL_ip4, ip4_input_node.index);
+ hdlc_register_input_protocol (vm, HDLC_PROTOCOL_ip4, ip4_input_node.index);
{
- pg_node_t * pn;
+ pg_node_t *pn;
pn = pg_get_node (ip4_input_node.index);
pn->unformat_edit = unformat_pg_ip4_header;
pn = pg_get_node (ip4_input_no_checksum_node.index);
@@ -434,7 +492,7 @@ static clib_error_t * ip4_init (vlib_main_t * vm)
if ((error = vlib_call_init_function (vm, ip4_source_check_init)))
return error;
- if ((error = vlib_call_init_function
+ if ((error = vlib_call_init_function
(vm, ip4_source_and_port_range_check_init)))
return error;
@@ -448,3 +506,11 @@ static clib_error_t * ip4_init (vlib_main_t * vm)
}
VLIB_INIT_FUNCTION (ip4_init);
+
+/*
+ * fd.io coding-style-patch-verification: ON
+ *
+ * Local Variables:
+ * eval: (c-set-style "gnu")
+ * End:
+ */