From: Willem de Bruijn <willemdebruijn.ker...@gmail.com> Date: Fri, 10 Jul 2020 09:29:02 -0400
> From: Willem de Bruijn <will...@google.com> > > Add setsockopt SOL_IP/IP_RECVERR_4884 to return the offset to an > extension struct if present. > > ICMP messages may include an extension structure after the original > datagram. RFC 4884 standardized this behavior. It stores the offset > in words to the extension header in u8 icmphdr.un.reserved[1]. > > The field is valid only for ICMP types destination unreachable, time > exceeded and parameter problem, if length is at least 128 bytes and > entire packet does not exceed 576 bytes. > > Return the offset to the start of the extension struct when reading an > ICMP error from the error queue, if it matches the above constraints. > > Do not return the raw u8 field. Return the offset from the start of > the user buffer, in bytes. The kernel does not return the network and > transport headers, so subtract those. > > Also validate the headers. Return the offset regardless of validation, > as an invalid extension must still not be misinterpreted as part of > the original datagram. Note that !invalid does not imply valid. If > the extension version does not match, no validation can take place, > for instance. > > For backward compatibility, make this optional, set by setsockopt > SOL_IP/IP_RECVERR_RFC4884. For API example and feature test, see > github.com/wdebruij/kerneltools/blob/master/tests/recv_icmp_v2.c > > For forward compatibility, reserve only setsockopt value 1, leaving > other bits for additional icmp extensions. > > Changes > v1->v2: > - convert word offset to byte offset from start of user buffer > - return in ee_data as u8 may be insufficient > - define extension struct and object header structs > - return len only if constraints met > - if returning len, also validate > > Signed-off-by: Willem de Bruijn <will...@google.com> Applied, thanks Willem.