1
0
mirror of https://github.com/nmap/nmap.git synced 2025-12-08 13:41:29 +00:00

Use 32-bit values, not 16, for IP ID values.

IP ID fields are overloaded to include the flow label of IPv6 packets.
In particular, abstract_ip_hdr is no longer limited to 16 bits.
This commit is contained in:
david
2013-10-27 06:33:45 +00:00
parent a628c0ae9c
commit 5df0e13ee2
3 changed files with 5 additions and 6 deletions

View File

@@ -730,8 +730,7 @@ static const void *ip_get_data_primitive(const void *packet, unsigned int *len,
memcpy(&sin6->sin6_addr, &ip6->ip6_dst, IP6_ADDR_LEN); memcpy(&sin6->sin6_addr, &ip6->ip6_dst, IP6_ADDR_LEN);
hdr->ttl = ip6->ip6_hlim; hdr->ttl = ip6->ip6_hlim;
/* abstract_hdr.ipid is limited to 16 bits. */ hdr->ipid = ntohl(ip6->ip6_flow & IP6_FLOWLABEL_MASK);
hdr->ipid = (u16) ntohl(ip6->ip6_flow & IP6_FLOWLABEL_MASK);
return ipv6_get_data_primitive(ip6, len, &hdr->proto, upperlayer_only); return ipv6_get_data_primitive(ip6, len, &hdr->proto, upperlayer_only);
} }

View File

@@ -160,7 +160,7 @@ struct abstract_ip_hdr {
struct sockaddr_storage dst; struct sockaddr_storage dst;
u8 proto; /* IPv4 proto or IPv6 next header. */ u8 proto; /* IPv4 proto or IPv6 next header. */
u8 ttl; /* IPv4 TTL or IPv6 hop limit. */ u8 ttl; /* IPv4 TTL or IPv6 hop limit. */
u16 ipid; /* IPv4 IP ID or IPv6 flow label. */ u32 ipid; /* IPv4 IP ID or IPv6 flow label. */
}; };
void netutil_fatal(const char *str, ...) void netutil_fatal(const char *str, ...)

View File

@@ -269,7 +269,7 @@ struct IPExtraProbeData_sctp {
}; };
struct IPExtraProbeData { struct IPExtraProbeData {
u16 ipid; /* host byte order */ u32 ipid; /* host byte order */
union { union {
struct IPExtraProbeData_icmp icmp; struct IPExtraProbeData_icmp icmp;
struct IPExtraProbeData_tcp tcp; struct IPExtraProbeData_tcp tcp;
@@ -328,7 +328,7 @@ public:
} }
/* not reached */ /* not reached */
} }
u16 ipid() const { u32 ipid() const {
return probes.IP.ipid; return probes.IP.ipid;
} }
u16 icmpid() const; // ICMP ident if protocol is ICMP u16 icmpid() const; // ICMP ident if protocol is ICMP
@@ -934,7 +934,7 @@ void UltraProbe::setIP(u8 *ippacket, u32 len, const probespec *pspec) {
data = ipv6_get_data_any(ip6, &len, &hdr); data = ipv6_get_data_any(ip6, &len, &hdr);
assert(data != NULL); assert(data != NULL);
assert(len == (u32) ntohs(ip6->ip6_plen)); assert(len == (u32) ntohs(ip6->ip6_plen));
probes.IP.ipid = ntohl(ip6->ip6_flow & IP6_FLOWLABEL_MASK) & 0xFFFF; probes.IP.ipid = ntohl(ip6->ip6_flow & IP6_FLOWLABEL_MASK);
hdr = ip6->ip6_nxt; hdr = ip6->ip6_nxt;
} else { } else {
fatal("Bogus packet passed to %s -- only IP packets allowed", __func__); fatal("Bogus packet passed to %s -- only IP packets allowed", __func__);