#include <vnet/ip/ip.h>
#include <vnet/ethernet/ethernet.h>
-
-extern char *ip4_error_strings[];
+#include <vppinfra/vector/ip_csum.h>
typedef enum
{
IP4_INPUT_NEXT_DROP,
IP4_INPUT_NEXT_PUNT,
+ IP4_INPUT_NEXT_OPTIONS,
IP4_INPUT_NEXT_LOOKUP,
IP4_INPUT_NEXT_LOOKUP_MULTICAST,
IP4_INPUT_NEXT_ICMP_ERROR,
- IP4_INPUT_NEXT_REASSEMBLY,
IP4_INPUT_N_NEXT,
} ip4_input_next_t;
if ((ip->ip_version_and_header_length & 0xf) != 5)
{
*error = IP4_ERROR_OPTIONS;
- if (verify_checksum && ip_csum (ip, ip4_header_bytes (ip)) != 0)
+ if (verify_checksum &&
+ clib_ip_csum ((u8 *) ip, ip4_header_bytes (ip)) != 0)
*error = IP4_ERROR_BAD_CHECKSUM;
}
else
*error = IP4_ERROR_VERSION;
}
- else
- if (PREDICT_FALSE (verify_checksum &&
- ip_csum (ip, sizeof (ip4_header_t)) != 0))
+ else if (PREDICT_FALSE (verify_checksum &&
+ clib_ip_csum ((u8 *) ip, sizeof (ip4_header_t)) !=
+ 0))
*error = IP4_ERROR_BAD_CHECKSUM;
}
}
else
next[0] = error0 != IP4_ERROR_OPTIONS ?
- IP4_INPUT_NEXT_DROP : IP4_INPUT_NEXT_PUNT;
+ IP4_INPUT_NEXT_DROP : IP4_INPUT_NEXT_OPTIONS;
p[0]->error = error_node->errors[error0];
}
if (PREDICT_FALSE (error1 != IP4_ERROR_NONE))
}
else
next[1] = error1 != IP4_ERROR_OPTIONS ?
- IP4_INPUT_NEXT_DROP : IP4_INPUT_NEXT_PUNT;
+ IP4_INPUT_NEXT_DROP : IP4_INPUT_NEXT_OPTIONS;
p[1]->error = error_node->errors[error1];
}
if (PREDICT_FALSE (error2 != IP4_ERROR_NONE))
}
else
next[2] = error2 != IP4_ERROR_OPTIONS ?
- IP4_INPUT_NEXT_DROP : IP4_INPUT_NEXT_PUNT;
+ IP4_INPUT_NEXT_DROP : IP4_INPUT_NEXT_OPTIONS;
p[2]->error = error_node->errors[error2];
}
if (PREDICT_FALSE (error3 != IP4_ERROR_NONE))
}
else
next[3] = error3 != IP4_ERROR_OPTIONS ?
- IP4_INPUT_NEXT_DROP : IP4_INPUT_NEXT_PUNT;
+ IP4_INPUT_NEXT_DROP : IP4_INPUT_NEXT_OPTIONS;
p[3]->error = error_node->errors[error3];
}
}
}
else
*next0 = error0 != IP4_ERROR_OPTIONS ?
- IP4_INPUT_NEXT_DROP : IP4_INPUT_NEXT_PUNT;
+ IP4_INPUT_NEXT_DROP : IP4_INPUT_NEXT_OPTIONS;
p0->error = error_node->errors[error0];
}
if (PREDICT_FALSE (error1 != IP4_ERROR_NONE))
}
else
*next1 = error1 != IP4_ERROR_OPTIONS ?
- IP4_INPUT_NEXT_DROP : IP4_INPUT_NEXT_PUNT;
+ IP4_INPUT_NEXT_DROP : IP4_INPUT_NEXT_OPTIONS;
p1->error = error_node->errors[error1];
}
-
}
always_inline void
check_ver_opt_csum (ip0, &error0, verify_checksum);
- /* Punt packets with options or wrong version. */
- if (PREDICT_FALSE (ip0->ip_version_and_header_length != 0x45))
- error0 = (ip0->ip_version_and_header_length & 0xf) != 5 ?
- IP4_ERROR_OPTIONS : IP4_ERROR_VERSION;
+ if (PREDICT_FALSE (ip0->ttl < 1))
+ error0 = IP4_ERROR_TIME_EXPIRED;
/* Drop fragmentation offset 1 packets. */
error0 = ip4_get_fragment_offset (ip0) == 1 ?
}
else
*next0 = error0 != IP4_ERROR_OPTIONS ?
- IP4_INPUT_NEXT_DROP : IP4_INPUT_NEXT_PUNT;
+ IP4_INPUT_NEXT_DROP : IP4_INPUT_NEXT_OPTIONS;
p0->error = error_node->errors[error0];
}
-
}
/*