From: Francois-Xavier Le Bail Date: Mon, 17 Feb 2025 20:12:09 +0000 (+0100) Subject: ICMPv6: Add printing for Node Information Queries Qtype "IPv4 Addresses" X-Git-Url: https://git.tcpdump.org/tcpdump/commitdiff_plain/d8ded9c8c22c4ad9828fa824721184c087b3db97 ICMPv6: Add printing for Node Information Queries Qtype "IPv4 Addresses" Add two test files. (cherry picked from commit 62078833231c635fcf296cdadb9fe0477a2d2acc) --- diff --git a/print-icmp6.c b/print-icmp6.c index 42a899d4..29fce0ef 100644 --- a/print-icmp6.c +++ b/print-icmp6.c @@ -401,6 +401,12 @@ static const struct tok ni_nodeaddr_flag_values[] = { { 0, NULL } }; +static const struct tok ni_ipv4addr_flag_values[] = { + { NI_NODEADDR_FLAG_TRUNCATE, "T" }, + { NI_NODEADDR_FLAG_ALL, "A" }, + { 0, NULL } +}; + struct ni_reply_fqdn { nd_uint32_t ni_fqdn_ttl; /* TTL */ nd_uint8_t ni_fqdn_namelen; /* length in octets of the FQDN */ @@ -1745,6 +1751,16 @@ icmp6_nodeinfo_print(netdissect_options *ndo, u_int icmp6len, const u_char *bp, if (flags & NI_NODEADDR_FLAG_TRUNCATE) ND_PRINT(" [invalid flag Truncate present]"); break; + case NI_QTYPE_IPV4ADDR: + ND_PRINT("ipv4 addresses"); + flags = GET_BE_U_2(ni6->ni_flags); + if (flags) + ND_PRINT(" [%s]", + bittok2str_nosep(ni_ipv4addr_flag_values, + "none", flags)); + if (flags & NI_NODEADDR_FLAG_TRUNCATE) + ND_PRINT(" [invalid flag Truncate present]"); + break; default: ND_PRINT("unknown"); break; @@ -1871,6 +1887,25 @@ icmp6_nodeinfo_print(netdissect_options *ndo, u_int icmp6len, const u_char *bp, i += sizeof(uint32_t) + sizeof(nd_ipv6); } break; + case NI_QTYPE_IPV4ADDR: + if (needcomma) + ND_PRINT(", "); + ND_PRINT("ipv4 addresses"); + flags = GET_BE_U_2(ni6->ni_flags); + if (flags) + ND_PRINT(" [%s]", + bittok2str_nosep(ni_nodeaddr_flag_values, + "none", flags)); + cp = (const u_char *)(ni6 + 1); + while (cp < ep) { + uint32_t ttl; + + ttl = GET_BE_U_4(cp); + cp += 4; + ND_PRINT(" %s(%u)", GET_IPADDR_STRING(cp), ttl); + cp += 4; + } + break; default: if (needcomma) ND_PRINT(", "); diff --git a/tests/TESTLIST b/tests/TESTLIST index 5ac8da29..8e7d88ea 100644 --- a/tests/TESTLIST +++ b/tests/TESTLIST @@ -194,6 +194,8 @@ icmpv6-rfc7112 icmpv6-rfc7112.pcap icmpv6-rfc7112.out icmpv6-RFC2894-RR icmpv6-RFC2894-RR.pcap icmpv6-RFC2894-RR.out icmpv6-RFC2894-RR-v icmpv6-RFC2894-RR.pcap icmpv6-RFC2894-RR-v.out -v icmpv6-ni-flags icmpv6-ni-flags.pcap icmpv6-ni-flags.out +icmpv6_nodeinfo_queryipv4 icmpv6_nodeinfo_queryipv4.pcap icmpv6_nodeinfo_queryipv4.out -v +icmpv6_nodeinfo_replyipv4 icmpv6_nodeinfo_replyipv4.pcap icmpv6_nodeinfo_replyipv4.out -v icmpv6_nodeinfo_queryipv6 icmpv6_nodeinfo_queryipv6.pcap icmpv6_nodeinfo_queryipv6.out -v icmpv6_nodeinfo_replyipv6 icmpv6_nodeinfo_replyipv6.pcap icmpv6_nodeinfo_replyipv6.out -v diff --git a/tests/icmpv6_nodeinfo_queryipv4.out b/tests/icmpv6_nodeinfo_queryipv4.out new file mode 100644 index 00000000..3126abd0 --- /dev/null +++ b/tests/icmpv6_nodeinfo_queryipv4.out @@ -0,0 +1 @@ + 1 2025-02-18 16:31:31.435136 IP6 (hlim 64, next-header ICMPv6 (58), payload length 20) ::1 > ::1: [icmp6 sum ok] ICMP6, node information query (ipv4 addresses [A], subject=192.0.2.1) diff --git a/tests/icmpv6_nodeinfo_queryipv4.pcap b/tests/icmpv6_nodeinfo_queryipv4.pcap new file mode 100644 index 00000000..44e72980 Binary files /dev/null and b/tests/icmpv6_nodeinfo_queryipv4.pcap differ diff --git a/tests/icmpv6_nodeinfo_replyipv4.out b/tests/icmpv6_nodeinfo_replyipv4.out new file mode 100644 index 00000000..e846b999 --- /dev/null +++ b/tests/icmpv6_nodeinfo_replyipv4.out @@ -0,0 +1 @@ + 1 2025-02-18 16:31:31.435136 IP6 (hlim 64, next-header ICMPv6 (58), payload length 40) ::1 > ::1: [icmp6 sum ok] ICMP6, node information reply (success, ipv4 addresses [A] 127.0.0.1(0) 192.0.2.1(0) 193.0.2.1(0)) diff --git a/tests/icmpv6_nodeinfo_replyipv4.pcap b/tests/icmpv6_nodeinfo_replyipv4.pcap new file mode 100644 index 00000000..dff3f652 Binary files /dev/null and b/tests/icmpv6_nodeinfo_replyipv4.pcap differ