From: Jesse Gross Date: Tue, 27 Dec 2011 01:33:03 +0000 (-0800) Subject: packet: Match userspace and kernel definition of ICMP header. X-Git-Url: http://git.onelab.eu/?p=sliver-openvswitch.git;a=commitdiff_plain;h=090b95eaad37d4db390aafa12a6ac37f18976034 packet: Match userspace and kernel definition of ICMP header. Current userspace considers an ICMP header to be 4 bytes consisting of the type, code, and checksum. The kernel considers it to be 8 bytes because it also counts the two data fields that contain type-specific information (and are always present). Since flow extract will zero out headers that are not completely present this means that an ICMP packet that has a header of 5-7 bytes will be interpreted differently by userspace and kernel. This fixes the problem by adopting the kernel's version of the ICMP header in userspace. Signed-off-by: Jesse Gross --- diff --git a/lib/packets.h b/lib/packets.h index 8422089d9..d783980f5 100644 --- a/lib/packets.h +++ b/lib/packets.h @@ -304,11 +304,23 @@ struct ip_header { }; BUILD_ASSERT_DECL(IP_HEADER_LEN == sizeof(struct ip_header)); -#define ICMP_HEADER_LEN 4 +#define ICMP_HEADER_LEN 8 struct icmp_header { uint8_t icmp_type; uint8_t icmp_code; ovs_be16 icmp_csum; + union { + struct { + ovs_be16 id; + ovs_be16 seq; + } echo; + struct { + ovs_be16 empty; + ovs_be16 mtu; + } frag; + ovs_be32 gateway; + } icmp_fields; + uint8_t icmp_data[0]; }; BUILD_ASSERT_DECL(ICMP_HEADER_LEN == sizeof(struct icmp_header));