#include <vnet/ip/ip.h>
#include <vnet/ethernet/ethernet.h>
-extern char *ip4_error_strings[];
-
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,
}
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];
}
-
}
/*