189 lines
5.7 KiB
C
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
|