From: Jozsef Kadlecsik Date: Fri, 21 Jan 2011 20:29:50 +0000 (+0100) Subject: Fixed broken ICMP and ICMPv6 handling X-Git-Tag: v5.4~1 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c3ad618ce8e52a484d9cea024a4cd5d7cade444f;p=ipset Fixed broken ICMP and ICMPv6 handling I mistyped the bitwise operator and the network-order conversion was missing too. Sigh, sendip cannot generate proper packets to check ICMP and ICMPv6 in the testsuite. :-( --- diff --git a/kernel/ip_set_getport.c b/kernel/ip_set_getport.c index 968c570..76737bb 100644 --- a/kernel/ip_set_getport.c +++ b/kernel/ip_set_getport.c @@ -47,25 +47,26 @@ get_port(const struct sk_buff *skb, int protocol, unsigned int protooff, break; } case IPPROTO_ICMP: { - struct icmphdr _icmph; + struct icmphdr _ich; const struct icmphdr *ic; - ic = skb_header_pointer(skb, protooff, sizeof(_icmph), &_icmph); + ic = skb_header_pointer(skb, protooff, sizeof(_ich), &_ich); if (ic == NULL) return false; - *port = (__force __be16)((ic->type << 8) & ic->code); + *port = (__force __be16)htons((ic->type << 8) | ic->code); break; } case IPPROTO_ICMPV6: { - struct icmp6hdr _icmph; + struct icmp6hdr _ich; const struct icmp6hdr *ic; - ic = skb_header_pointer(skb, protooff, sizeof(_icmph), &_icmph); + ic = skb_header_pointer(skb, protooff, sizeof(_ich), &_ich); if (ic == NULL) return false; - *port = (__force __be16)((ic->icmp6_type << 8) & ic->icmp6_code); + *port = (__force __be16) + htons((ic->icmp6_type << 8) | ic->icmp6_code); break; } default: