On Wed, Feb 17, 2021 at 1:10 PM Andreas Roeseler <andreas.a.roese...@gmail.com> wrote: > > Add definitions for PROBE ICMP types and codes. > > Add AFI definitions for IP and IPV6 as specified by IANA > > Add a struct to represent the additional header when probing by IP > address (ctype == 3) for use in parsing incoming PROBE messages. > > Add a struct to represent the entire Interface Identification Object > (IIO) section of an incoming PROBE packet > > Signed-off-by: Andreas Roeseler <andreas.a.roese...@gmail.com> > --- > Changes since v1: > - Add AFI_IP and AFI_IP6 definitions > > Changes since v2: > Suggested by Willem de Brujin <willemdebrujin.ker...@gmail.com> > - Add prefix for PROBE specific defined variables > - Create struct icmp_ext_echo_iio for parsing incoming packet > --- > include/uapi/linux/icmp.h | 40 +++++++++++++++++++++++++++++++++++++++ > 1 file changed, 40 insertions(+) > > diff --git a/include/uapi/linux/icmp.h b/include/uapi/linux/icmp.h > index fb169a50895e..166ca77561de 100644 > --- a/include/uapi/linux/icmp.h > +++ b/include/uapi/linux/icmp.h > @@ -66,6 +66,23 @@ > #define ICMP_EXC_TTL 0 /* TTL count exceeded */ > #define ICMP_EXC_FRAGTIME 1 /* Fragment Reass time exceeded */ > > +/* Codes for EXT_ECHO (PROBE) */ > +#define ICMP_EXT_ECHO 42 > +#define ICMP_EXT_ECHOREPLY 43 > +#define ICMP_EXT_MAL_QUERY 1 /* Malformed Query */ > +#define ICMP_EXT_NO_IF 2 /* No such Interface */ > +#define ICMP_EXT_NO_TABLE_ENT 3 /* No such Table Entry */ > +#define ICMP_EXT_MULT_IFS 4 /* Multiple Interfaces Satisfy Query > */ > + > +/* constants for EXT_ECHO (PROBE) */ > +#define EXT_ECHOREPLY_ACTIVE (1 << 2)/* position of active flag in reply */ > +#define EXT_ECHOREPLY_IPV4 (1 << 1)/* position of ipv4 flag in reply */ > +#define EXT_ECHOREPLY_IPV6 1 /* position of ipv6 flag in reply */ > +#define EXT_ECHO_CTYPE_NAME 1 > +#define EXT_ECHO_CTYPE_INDEX 2 > +#define EXT_ECHO_CTYPE_ADDR 3 > +#define EXT_ECHO_AFI_IP 1 /* Address Family Identifier > for IPV4 */ > +#define EXT_ECHO_AFI_IP6 2 /* Address Family Identifier for IPV6 > */ > > struct icmphdr { > __u8 type; > @@ -118,4 +135,27 @@ struct icmp_extobj_hdr { > __u8 class_type; > }; > > +/* RFC 8335: 2.1 Header for C-type 3 payload */ > +struct icmp_ext_echo_ctype3_hdr { > + __u16 afi; > + __u8 addrlen; > + __u8 reserved; > +}; > + > +/* RFC 8335: Interface Identification Object */ > +struct icmp_ext_echo_iio { > + struct icmp_extobj_hdr extobj_hdr; > + union { > + __u32 ifIndex;
please no camelcase. > + char name; why single char? > + struct { > + struct icmp_ext_echo_ctype3_hdr ctype3_hdr; > + union { > + __be32 ipv4_addr; perhaps struct in_addr > + struct in6_addr ipv6_addr; > + } ip_addr; > + } addr; > + } ident; > +}; > + > #endif /* _UAPI_LINUX_ICMP_H */ > -- > 2.25.1 >