diff --git a/sys/windivert.c b/sys/windivert.c index b9d05ca..f84b136 100644 --- a/sys/windivert.c +++ b/sys/windivert.c @@ -3087,10 +3087,12 @@ static BOOL windivert_filter(PNET_BUFFER buffer, UINT32 if_idx, field[0] = (UINT32)icmpv6_header->Code; break; case WINDIVERT_FILTER_FIELD_ICMPV6_CHECKSUM: - field[0] = (UINT32)icmpv6_header->Checksum; + field[0] = + (UINT32)RtlUshortByteSwap(icmpv6_header->Checksum); break; case WINDIVERT_FILTER_FIELD_ICMPV6_BODY: - field[0] = (UINT32)icmpv6_header->Body; + field[0] = + (UINT32)RtlUlongByteSwap(icmpv6_header->Body); break; case WINDIVERT_FILTER_FIELD_TCP_SRCPORT: field[0] = (UINT32)RtlUshortByteSwap(tcp_header->SrcPort); diff --git a/test/test.c b/test/test.c index b1fd969..9a76526 100644 --- a/test/test.c +++ b/test/test.c @@ -77,6 +77,12 @@ static struct packet pkt_ipv6_tcp_syn = sizeof(ipv6_tcp_syn), "ipv6_tcp_syn" }; +static struct packet pkt_ipv6_echo_reply = +{ + ipv6_echo_reply, + sizeof(ipv6_echo_reply), + "ipv6_icmpv6_echo_rep" +}; static struct packet pkt_ipv6_exthdrs_udp = { ipv6_exthdrs_udp, @@ -113,6 +119,15 @@ static struct test tests[] = {"ipv6.SrcAddr == aabb:5678:1::1234:ccdd", &pkt_ipv6_tcp_syn, FALSE}, {"tcp.SrcPort == 50046", &pkt_ipv6_tcp_syn, TRUE}, {"tcp.SrcPort == 0x0000C37E", &pkt_ipv6_tcp_syn, TRUE}, + {"icmpv6", &pkt_ipv6_echo_reply, TRUE}, + {"icmp", &pkt_ipv6_echo_reply, FALSE}, + {"icmp or icmpv6", &pkt_ipv6_echo_reply, TRUE}, + {"not icmp", &pkt_ipv6_echo_reply, TRUE}, + {"icmpv6.Type == 129", &pkt_ipv6_echo_reply, TRUE}, + {"icmpv6.Code == 0", &pkt_ipv6_echo_reply, TRUE}, + {"icmpv6.Body == 0x10720003", &pkt_ipv6_echo_reply, TRUE}, + {"ipv6.DstAddr >= 1000", &pkt_ipv6_echo_reply, FALSE}, + {"ipv6.DstAddr <= 1", &pkt_ipv6_echo_reply, TRUE}, {"true", &pkt_ipv6_exthdrs_udp, TRUE}, {"udp", &pkt_ipv6_exthdrs_udp, TRUE}, {"tcp", &pkt_ipv6_exthdrs_udp, FALSE}, diff --git a/test/test_data.c b/test/test_data.c index adf2845..5f50033 100644 --- a/test/test_data.c +++ b/test/test_data.c @@ -118,6 +118,24 @@ static unsigned char ipv6_tcp_syn[] = 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x07 }; +// IPV6 ICMPV6 ECHO REPLY +static unsigned char ipv6_echo_reply[] = +{ + 0x60, 0x00, 0x00, 0x00, 0x00, 0x40, 0x3a, 0x1f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x81, 0x00, 0x00, 0x00, 0x10, 0x72, 0x00, 0x03, + 0xa4, 0xd5, 0x69, 0x54, 0x00, 0x00, 0x00, 0x00, + 0xab, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, + 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, + 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, + 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, + 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 +}; + // IPV6 EXTENSION HEADERS UDP static unsigned char ipv6_exthdrs_udp[] = {