Hi,
In file vnet/ip/ip6_forward.c(VPP 21.01), function ip6_local_inline(), the 
node's packet processing has the following check:

if (PREDICT_FALSE (need_csum))
{
flags = ip6_tcp_udp_icmp_validate_checksum (vm, b[0]);
good_l4_csum = flags & VNET_BUFFER_F_L4_CHECKSUM_CORRECT;
error = IP6_ERROR_UNKNOWN_PROTOCOL;
}
else
{
if (ip6_tcp_udp_icmp_bad_length (vm, b[0]))
error = IP6_ERROR_BAD_LENGTH;
}

Kindly explain the reason behind the checksum and the length validation being 
under the if-else check, making the length validation not applicable for the 
case when checksum validation is applicable.

Also, in the function ip6_tcp_udp_icmp_bad_length (refer the below snippet), 
the function seems to assume that the hop-by-hop extension header shall always 
be present. Is it that, IPv6 hop-by-hop extension header has to be mandatorily 
present?

static_always_inline u8
ip6_tcp_udp_icmp_bad_length (vlib_main_t * vm, vlib_buffer_t * p0)
{

u16 payload_length_host_byte_order;
u32 n_this_buffer, n_bytes_left;
ip6_header_t *ip0 = vlib_buffer_get_current (p0);
u32 headers_size = sizeof (ip0[0]);
u8 *data_this_buffer;

data_this_buffer = (u8 *) (ip0 + 1);

ip6_hop_by_hop_ext_t *ext_hdr = (ip6_hop_by_hop_ext_t *) data_this_buffer;

/* validate really icmp6 next */

if (!(ext_hdr->next_hdr == IP_PROTOCOL_ICMP6)
|| (ext_hdr->next_hdr == IP_PROTOCOL_UDP))
return 0;
::
::

Thanks,
Pankaj Malhotra
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#20409): https://lists.fd.io/g/vpp-dev/message/20409
Mute This Topic: https://lists.fd.io/mt/86774091/21656
Group Owner: vpp-dev+ow...@lists.fd.io
Unsubscribe: https://lists.fd.io/g/vpp-dev/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to