windows-nt/Source/XPSP1/NT/net/inc/icmp6.h
2020-09-26 16:20:57 +08:00

189 lines
5.7 KiB
C

// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil -*- (for GNU Emacs)
//
// Copyright (c) 1985-2000 Microsoft Corporation
//
// This file is part of the Microsoft Research IPv6 Network Protocol Stack.
// You should have received a copy of the Microsoft End-User License Agreement
// for this software along with this release; see the file "license.txt".
// If not, please see http://www.research.microsoft.com/msripv6/license.htm,
// or write to Microsoft Research, One Microsoft Way, Redmond, WA 98052-6399.
//
// Abstract:
//
// Definitions derived from the IPv6 specifications.
//
#ifndef ICMP6_INCLUDED
#define ICMP6_INCLUDED 1
//
// ICMPv6 Header.
// The actual message body follows this header and is type-specific.
//
typedef struct ICMPv6Header {
UCHAR Type; // Type of message (high bit zero for error messages).
UCHAR Code; // Type-specific differentiater.
USHORT Checksum; // Calculated over ICMPv6 message and IPv6 psuedo-header.
} ICMPv6Header;
//
// ICMPv6 Type field definitions.
//
#define ICMPv6_DESTINATION_UNREACHABLE 1
#define ICMPv6_PACKET_TOO_BIG 2
#define ICMPv6_TIME_EXCEEDED 3
#define ICMPv6_PARAMETER_PROBLEM 4
#define ICMPv6_ECHO_REQUEST 128
#define ICMPv6_ECHO_REPLY 129
#define ICMPv6_MULTICAST_LISTENER_QUERY 130
#define ICMPv6_MULTICAST_LISTENER_REPORT 131
#define ICMPv6_MULTICAST_LISTENER_DONE 132
#define ICMPv6_ROUTER_SOLICIT 133
#define ICMPv6_ROUTER_ADVERT 134
#define ICMPv6_NEIGHBOR_SOLICIT 135
#define ICMPv6_NEIGHBOR_ADVERT 136
#define ICMPv6_REDIRECT 137
#define ICMPv6_ROUTER_RENUMBERING 138
#define ICMPv6_INFORMATION_TYPE(type) ((type) & 0x80)
#define ICMPv6_ERROR_TYPE(type) (((type) & 0x80) == 0)
// Max amount of packet data in an ICMP error message.
#define ICMPv6_ERROR_MAX_DATA_LEN \
(IPv6_MINIMUM_MTU - sizeof(IPv6Header) - \
sizeof(ICMPv6Header) - sizeof(UINT))
//
// ICMPv6 Code field definitions.
//
// For Destination Unreachable errors:
#define ICMPv6_NO_ROUTE_TO_DESTINATION 0
#define ICMPv6_COMMUNICATION_PROHIBITED 1
// was ICMPv6_NOT_NEIGHBOR 2
#define ICMPv6_SCOPE_MISMATCH 2
#define ICMPv6_ADDRESS_UNREACHABLE 3
#define ICMPv6_PORT_UNREACHABLE 4
// For Time Exceeded errors:
#define ICMPv6_HOP_LIMIT_EXCEEDED 0
#define ICMPv6_REASSEMBLY_TIME_EXCEEDED 1
// For Parameter Problem errors:
#define ICMPv6_ERRONEOUS_HEADER_FIELD 0
#define ICMPv6_UNRECOGNIZED_NEXT_HEADER 1
#define ICMPv6_UNRECOGNIZED_OPTION 2
//
// Neighbor Discovery message option definitions.
//
#define ND_OPTION_SOURCE_LINK_LAYER_ADDRESS 1
#define ND_OPTION_TARGET_LINK_LAYER_ADDRESS 2
#define ND_OPTION_PREFIX_INFORMATION 3
#define ND_OPTION_REDIRECTED_HEADER 4
#define ND_OPTION_MTU 5
#define ND_NBMA_SHORTCUT_LIMIT 6 // Related to IPv6-NBMA.
#define ND_ADVERTISEMENT_INTERVAL 7 // For IPv6 Mobility.
#define ND_HOME_AGENT_INFO 8 // For IPv6 Mobility.
#define ND_OPTION_ROUTE_INFORMATION 9
//
// Neighbor Advertisement message flags.
//
#define ND_NA_FLAG_ROUTER 0x80000000
#define ND_NA_FLAG_SOLICITED 0x40000000
#define ND_NA_FLAG_OVERRIDE 0x20000000
typedef struct NDRouterAdvertisement {
UCHAR CurHopLimit;
UCHAR Flags;
USHORT RouterLifetime;
UINT ReachableTime;
UINT RetransTimer;
} NDRouterAdvertisement;
//
// Router Advertisement message flags.
//
#define ND_RA_FLAG_MANAGED 0x80
#define ND_RA_FLAG_OTHER 0x40
#define ND_RA_FLAG_HOME_AGENT 0x20
#define ND_RA_FLAG_PREFERENCE 0x18 // A two-bit field.
typedef struct NDOptionMTU {
UCHAR Type;
UCHAR Length;
USHORT Reserved;
UINT MTU;
} NDOptionMTU;
typedef struct NDOptionPrefixInformation {
UCHAR Type;
UCHAR Length;
UCHAR PrefixLength;
UCHAR Flags;
UINT ValidLifetime;
UINT PreferredLifetime;
union { // Preserve compatibility with the pre-SitePrefixLength version.
UINT Reserved2;
struct {
UCHAR Reserved3[3];
UCHAR SitePrefixLength;
};
};
IN6_ADDR Prefix;
} NDOptionPrefixInformation;
//
// Prefix Information option flags.
//
#define ND_PREFIX_FLAG_ON_LINK 0x80
#define ND_PREFIX_FLAG_AUTONOMOUS 0x40
#define ND_PREFIX_FLAG_ROUTER_ADDRESS 0x20
#define ND_PREFIX_FLAG_SITE_PREFIX 0x10
#define ND_PREFIX_FLAG_ROUTE 0x01
//
// NDOptionRouteInformation is actually variable-sized.
// If PrefixLength is zero, then the Prefix field may be 0 bytes.
// If PrefixLength is <= 64, then the Prefix field may be 8 bytes.
// Otherwise the Prefix field is a full 16 bytes.
//
typedef struct NDOptionRouteInformation {
UCHAR Type;
UCHAR Length;
UCHAR PrefixLength;
UCHAR Flags;
UINT RouteLifetime;
IN6_ADDR Prefix;
} NDOptionRouteInformation;
//
// MLD message struct - this immediately follows the ICMPv6 header.
// NB: If IN6_ADDR ever has stricter alignment than USHORT,
// this definition will need to change. Probably it should
// include ICMPv6Header so that GroupAddr is aligned properly.
//
typedef struct MLDMessage {
USHORT MaxResponseDelay;
USHORT Unused;
IN6_ADDR GroupAddr;
} MLDMessage;
C_ASSERT(__builtin_alignof(MLDMessage) == __builtin_alignof(USHORT));
//
// Router Renumbering code values.
//
#define RR_COMMAND 0
#define RR_RESULT 1
#define RR_SEQUENCE_NO_RESET 255
#endif // ICMP6_INCLUDED