1999-04-06 16:24:50 +00:00
|
|
|
/* packet-ipv6.h
|
2002-08-28 21:04:11 +00:00
|
|
|
* Definitions for IPv6 packet disassembly
|
1999-04-06 16:24:50 +00:00
|
|
|
*
|
2002-08-28 21:04:11 +00:00
|
|
|
* $Id: packet-ipv6.h,v 1.28 2002/08/28 21:00:18 jmayer Exp $
|
1999-04-06 16:24:50 +00:00
|
|
|
*
|
|
|
|
* Ethereal - Network traffic analyzer
|
2001-01-23 02:49:55 +00:00
|
|
|
* By Gerald Combs <gerald@ethereal.com>
|
|
|
|
*
|
1999-04-06 16:24:50 +00:00
|
|
|
* Copyright 1998 Gerald Combs
|
|
|
|
*
|
2001-01-23 02:49:55 +00:00
|
|
|
* MobileIPv6 support added by Tomislav Borosa <tomislav.borosa@siemens.hr>
|
2001-09-04 21:04:52 +00:00
|
|
|
*
|
|
|
|
* HMIPv6 support added by Martti Kuparinen <martti.kuparinen@iki.fi>
|
2002-08-28 21:04:11 +00:00
|
|
|
*
|
1999-04-06 16:24:50 +00:00
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
2002-08-28 21:04:11 +00:00
|
|
|
*
|
1999-04-06 16:24:50 +00:00
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
2002-08-28 21:04:11 +00:00
|
|
|
*
|
1999-04-06 16:24:50 +00:00
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
*/
|
|
|
|
|
1999-03-28 18:32:03 +00:00
|
|
|
#ifndef __PACKET_IPV6_H_DEFINED__
|
|
|
|
#define __PACKET_IPV6_H_DEFINED__
|
|
|
|
|
2002-01-21 07:37:49 +00:00
|
|
|
#include <epan/ipv6-utils.h>
|
1999-07-23 15:08:25 +00:00
|
|
|
|
1999-03-28 18:32:03 +00:00
|
|
|
#define INET6_ADDRSTRLEN 46
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Definition for internet protocol version 6.
|
|
|
|
* RFC 1883
|
|
|
|
*/
|
|
|
|
struct ip6_hdr {
|
|
|
|
union {
|
|
|
|
struct ip6_hdrctl {
|
|
|
|
guint32 ip6_un1_flow; /* 20 bits of flow-ID */
|
|
|
|
guint16 ip6_un1_plen; /* payload length */
|
|
|
|
guint8 ip6_un1_nxt; /* next header */
|
|
|
|
guint8 ip6_un1_hlim; /* hop limit */
|
|
|
|
} ip6_un1;
|
|
|
|
guint8 ip6_un2_vfc; /* 4 bits version, 4 bits class */
|
|
|
|
} ip6_ctlun;
|
|
|
|
struct e_in6_addr ip6_src; /* source address */
|
|
|
|
struct e_in6_addr ip6_dst; /* destination address */
|
|
|
|
};
|
|
|
|
|
|
|
|
#define ip6_vfc ip6_ctlun.ip6_un2_vfc
|
|
|
|
#define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow
|
|
|
|
#define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen
|
|
|
|
#define ip6_nxt ip6_ctlun.ip6_un1.ip6_un1_nxt
|
|
|
|
#define ip6_hlim ip6_ctlun.ip6_un1.ip6_un1_hlim
|
|
|
|
#define ip6_hops ip6_ctlun.ip6_un1.ip6_un1_hlim
|
|
|
|
|
Generalize the "ip_src" and "ip_dst" members of the "packet_info"
structure to "dl_src"/"dl_dst", "net_src"/"net_dst", and "src"/"dst"
addresses, where an address is an address type, an address length in
bytes, and a pointer to that many bytes.
"dl_{src,dst}" are the link-layer source/destination; "net_{src,dst}"
are the network-layer source/destination; "{src,dst}" are the
source/destination from the highest of those two layers that we have in
the packet.
Add a port type to "packet_info" as well, specifying whether it's a TCP
or UDP port.
Don't set the address and port columns in the dissector functions; just
set the address and port members of the "packet_info" structure. Set
the columns in "fill_in_columns()"; this means that if we're showing
COL_{DEF,RES,UNRES}_SRC" or "COL_{DEF,RES,UNRES}_DST", we only generate
the string from "src" or "dst", we don't generate a string for the
link-layer address and then overwrite it with a string for the
network-layer address (generating those strings costs CPU).
Add support for "conversations", where a "conversation" is (at present)
a source and destination address and a source and destination port. (In
the future, we may support "conversations" above the transport layer,
e.g. a TFTP conversation, where the first packet goes from the client to
the TFTP server port, but the reply comes back from a different port,
and all subsequent packets go between the client address/port and the
server address/new port, or an NFS conversation, which might include
lock manager, status monitor, and mount packets, as well as NFS
packets.)
Currently, all we support is a call that takes the source and
destination address/port pairs, looks them up in a hash table, and:
if nothing is found, creates a new entry in the hash table, and
assigns it a unique 32-bit conversation ID, and returns that
conversation ID;
if an entry is found, returns its conversation ID.
Use that in the SMB and AFS code to keep track of individual SMB or AFS
conversations. We need to match up requests and replies, as, for
certain replies, the operation code for the request to which it's a
reply doesn't show up in the reply - you have to find the request with a
matching transaction ID. Transaction IDs are per-conversation, so the
hash table for requests should include a conversation ID and transaction
ID as the key.
This allows SMB and AFS decoders to handle IPv4 or IPv6 addresses
transparently (and should allow the SMB decoder to handle NetBIOS atop
other protocols as well, if the source and destination address and port
values in the "packet_info" structure are set appropriately).
In the "Follow TCP Connection" code, check to make sure that the
addresses are IPv4 addressses; ultimately, that code should be changed
to use the conversation code instead, which will let it handle IPv6
transparently.
svn path=/trunk/; revision=909
1999-10-22 07:18:23 +00:00
|
|
|
/* Offsets of fields within an IPv6 header. */
|
|
|
|
#define IP6H_CTL 0
|
|
|
|
#define IP6H_CTL_FLOW 0
|
|
|
|
#define IP6H_CTL_PLEN 4
|
|
|
|
#define IP6H_CTL_NXT 6
|
|
|
|
#define IP6H_CTL_HLIM 7
|
|
|
|
#define IP6H_CTL_VFC 0
|
|
|
|
#define IP6H_SRC 8
|
|
|
|
#define IP6H_DST 24
|
|
|
|
|
1999-03-28 18:32:03 +00:00
|
|
|
#define IPV6_FLOWINFO_MASK 0x0fffffff /* flow info (28 bits) */
|
|
|
|
#define IPV6_FLOWLABEL_MASK 0x000fffff /* flow label (20 bits) */
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Extension Headers
|
|
|
|
*/
|
|
|
|
|
|
|
|
struct ip6_ext {
|
2002-08-02 23:36:07 +00:00
|
|
|
guchar ip6e_nxt;
|
|
|
|
guchar ip6e_len;
|
1999-03-28 18:32:03 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/* Hop-by-Hop options header */
|
|
|
|
/* XXX should we pad it to force alignment on an 8-byte boundary? */
|
|
|
|
struct ip6_hbh {
|
|
|
|
guint8 ip6h_nxt; /* next header */
|
|
|
|
guint8 ip6h_len; /* length in units of 8 octets */
|
|
|
|
/* followed by options */
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Destination options header */
|
|
|
|
/* XXX should we pad it to force alignment on an 8-byte boundary? */
|
|
|
|
struct ip6_dest {
|
|
|
|
guint8 ip6d_nxt; /* next header */
|
|
|
|
guint8 ip6d_len; /* length in units of 8 octets */
|
|
|
|
/* followed by options */
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Option types and related macros */
|
|
|
|
#define IP6OPT_PAD1 0x00 /* 00 0 00000 */
|
|
|
|
#define IP6OPT_PADN 0x01 /* 00 0 00001 */
|
|
|
|
#define IP6OPT_JUMBO 0xC2 /* 11 0 00010 = 194 */
|
|
|
|
#define IP6OPT_JUMBO_LEN 6
|
|
|
|
#define IP6OPT_RTALERT 0x05 /* 00 0 00101 */
|
2001-06-01 23:53:49 +00:00
|
|
|
|
1999-03-28 18:32:03 +00:00
|
|
|
#define IP6OPT_RTALERT_LEN 4
|
|
|
|
#define IP6OPT_RTALERT_MLD 0 /* Datagram contains MLD message */
|
|
|
|
#define IP6OPT_RTALERT_RSVP 1 /* Datagram contains RSVP message */
|
2001-06-01 23:53:49 +00:00
|
|
|
#define IP6OPT_RTALERT_ACTNET 2 /* contains an Active Networks msg */
|
1999-03-28 18:32:03 +00:00
|
|
|
#define IP6OPT_MINLEN 2
|
|
|
|
|
2001-06-01 23:53:49 +00:00
|
|
|
#define IP6OPT_BINDING_UPDATE 0xC6 /* 11 0 00110 */
|
|
|
|
#define IP6OPT_BINDING_ACK 0x07 /* 00 0 00111 */
|
|
|
|
#define IP6OPT_BINDING_REQUEST 0x08 /* 00 0 01000 */
|
|
|
|
#define IP6OPT_HOME_ADDRESS 0xC9 /* 11 0 01001 */
|
|
|
|
#define IP6OPT_EID 0x8a /* 10 0 01010 */
|
|
|
|
#define IP6OPT_MIPv6_UNIQUE_ID_SUB 0x02 /* 00 0 00010 */
|
|
|
|
#define IP6OPT_MIPv6_ALTERNATIVE_COA_SUB 0x04 /* 00 0 00100 */
|
|
|
|
|
1999-03-28 18:32:03 +00:00
|
|
|
#define IP6OPT_TYPE(o) ((o) & 0xC0)
|
|
|
|
#define IP6OPT_TYPE_SKIP 0x00
|
|
|
|
#define IP6OPT_TYPE_DISCARD 0x40
|
|
|
|
#define IP6OPT_TYPE_FORCEICMP 0x80
|
|
|
|
#define IP6OPT_TYPE_ICMP 0xC0
|
|
|
|
|
|
|
|
#define IP6OPT_MUTABLE 0x20
|
|
|
|
|
2001-01-23 02:49:55 +00:00
|
|
|
/* MIPv6 Lifetime */
|
|
|
|
#define MIP_INFINITY 0xffffffff /* Infinity lifetime */
|
|
|
|
|
|
|
|
/* Binding Update Flags */
|
|
|
|
#define IP6_MIPv6_BU_A_FLAG 0x80 /* 1000 0000 - Acknowledge */
|
|
|
|
#define IP6_MIPv6_BU_H_FLAG 0x40 /* 0100 0000 - Home Registration */
|
|
|
|
#define IP6_MIPv6_BU_R_FLAG 0x20 /* 0010 0000 - Router */
|
|
|
|
#define IP6_MIPv6_BU_D_FLAG 0x10 /* 0001 0000 - Duplicate Address Detection */
|
|
|
|
#define IP6_MIPv6_BU_M_FLAG 0x8 /* 0000 1000 - MAP Registration */
|
|
|
|
#define IP6_MIPv6_BU_B_FLAG 0x4 /* 0000 0100 - Request for bicasting */
|
|
|
|
|
|
|
|
#define IP6_MIPv6_OPTION_TYPE_LENGTH 1
|
|
|
|
#define IP6_MIPv6_OPTION_LENGTH_LENGTH 1
|
|
|
|
#define IP6_MIPv6_FLAGS_LENGTH 1
|
|
|
|
#define IP6_MIPv6_PREFIX_LENGTH_LENGTH 1
|
|
|
|
#define IP6_MIPv6_SEQUENCE_NUMBER_LENGTH 2
|
|
|
|
#define IP6_MIPv6_LIFE_TIME_LENGTH 4
|
|
|
|
#define IP6_MIPv6_REFRESH_LENGTH 4
|
|
|
|
#define IP6_MIPv6_STATUS_LENGTH 1
|
|
|
|
#define IP6_MIPv6_HOME_ADDRESS_LENGTH 16
|
|
|
|
#define IP6_MIPv6_SUB_TYPE_LENGTH 1
|
|
|
|
#define IP6_MIPv6_SUB_LENGTH_LENGTH 1
|
|
|
|
#define IP6_MIPv6_SUB_UNIQUE_ID_LENGTH 2
|
|
|
|
#define IP6_MIPv6_SUB_ALTERNATIVE_COA_LENGTH 16
|
|
|
|
|
|
|
|
/* Binding Ackonwledgement Status */
|
|
|
|
#define BA_OK 0 /* Binding update accepted */
|
|
|
|
#define BA_REAS_UNSPEC 128 /*Reason unspecified */
|
|
|
|
#define BA_ADMIN_PROH 130 /* Administratively prohibited */
|
|
|
|
#define BA_INSUF_RES 131 /* Insufficient resources */
|
|
|
|
#define BA_NO_HR 132 /* Home registration not supported */
|
|
|
|
#define BA_NO_SUBNET 133 /* Not home subnet */
|
|
|
|
#define BA_ERR_ID_LEN 136 /* Incorrect interface identifier length */
|
|
|
|
#define BA_NO_HA 137 /* Not home agent for this mobile node */
|
|
|
|
#define BA_DUPL_ADDR 138 /* Duplicate Address Detection failed */
|
|
|
|
|
1999-03-28 18:32:03 +00:00
|
|
|
/* Routing header */
|
|
|
|
struct ip6_rthdr {
|
|
|
|
guint8 ip6r_nxt; /* next header */
|
|
|
|
guint8 ip6r_len; /* length in units of 8 octets */
|
|
|
|
guint8 ip6r_type; /* routing type */
|
|
|
|
guint8 ip6r_segleft; /* segments left */
|
|
|
|
/* followed by routing type specific data */
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Type 0 Routing header */
|
|
|
|
struct ip6_rthdr0 {
|
|
|
|
guint8 ip6r0_nxt; /* next header */
|
|
|
|
guint8 ip6r0_len; /* length in units of 8 octets */
|
|
|
|
guint8 ip6r0_type; /* always zero */
|
|
|
|
guint8 ip6r0_segleft; /* segments left */
|
|
|
|
guint8 ip6r0_reserved; /* reserved field */
|
|
|
|
guint8 ip6r0_slmap[3]; /* strict/loose bit map */
|
|
|
|
struct e_in6_addr ip6r0_addr[1]; /* up to 23 addresses */
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Fragment header */
|
|
|
|
struct ip6_frag {
|
|
|
|
guint8 ip6f_nxt; /* next header */
|
|
|
|
guint8 ip6f_reserved; /* reserved field */
|
|
|
|
guint16 ip6f_offlg; /* offset, reserved, and flag */
|
|
|
|
guint32 ip6f_ident; /* identification */
|
|
|
|
};
|
|
|
|
|
|
|
|
#define IP6F_OFF_MASK 0xfff8 /* mask out offset from _offlg */
|
|
|
|
#define IP6F_RESERVED_MASK 0x0006 /* reserved bits in ip6f_offlg */
|
|
|
|
#define IP6F_MORE_FRAG 0x0001 /* more-fragments flag */
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Definition for ICMPv6.
|
|
|
|
* RFC 1885
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define ICMPV6_PLD_MAXLEN 1232 /* IPV6_MMTU - sizeof(struct ip6_hdr)
|
|
|
|
- sizeof(struct icmp6_hdr) */
|
|
|
|
|
|
|
|
struct icmp6_hdr {
|
|
|
|
guint8 icmp6_type; /* type field */
|
|
|
|
guint8 icmp6_code; /* code field */
|
|
|
|
guint16 icmp6_cksum; /* checksum field */
|
|
|
|
union {
|
|
|
|
guint32 icmp6_un_data32[1]; /* type-specific field */
|
|
|
|
guint16 icmp6_un_data16[2]; /* type-specific field */
|
|
|
|
guint8 icmp6_un_data8[4]; /* type-specific field */
|
|
|
|
} icmp6_dataun;
|
|
|
|
};
|
|
|
|
|
|
|
|
#define icmp6_data32 icmp6_dataun.icmp6_un_data32
|
|
|
|
#define icmp6_data16 icmp6_dataun.icmp6_un_data16
|
|
|
|
#define icmp6_data8 icmp6_dataun.icmp6_un_data8
|
|
|
|
#define icmp6_pptr icmp6_data32[0] /* parameter prob */
|
|
|
|
#define icmp6_mtu icmp6_data32[0] /* packet too big */
|
|
|
|
#define icmp6_id icmp6_data16[0] /* echo request/reply */
|
|
|
|
#define icmp6_seq icmp6_data16[1] /* echo request/reply */
|
|
|
|
#define icmp6_maxdelay icmp6_data16[0] /* mcast group membership */
|
|
|
|
|
|
|
|
#define ICMP6_DST_UNREACH 1 /* dest unreachable, codes: */
|
|
|
|
#define ICMP6_PACKET_TOO_BIG 2 /* packet too big */
|
|
|
|
#define ICMP6_TIME_EXCEEDED 3 /* time exceeded, code: */
|
|
|
|
#define ICMP6_PARAM_PROB 4 /* ip6 header bad */
|
|
|
|
|
|
|
|
#define ICMP6_ECHO_REQUEST 128 /* echo service */
|
|
|
|
#define ICMP6_ECHO_REPLY 129 /* echo reply */
|
|
|
|
#define ICMP6_MEMBERSHIP_QUERY 130 /* group membership query */
|
|
|
|
#define MLD6_LISTENER_QUERY 130 /* multicast listener query */
|
|
|
|
#define ICMP6_MEMBERSHIP_REPORT 131 /* group membership report */
|
|
|
|
#define MLD6_LISTENER_REPORT 131 /* multicast listener report */
|
|
|
|
#define ICMP6_MEMBERSHIP_REDUCTION 132 /* group membership termination */
|
|
|
|
#define MLD6_LISTENER_DONE 132 /* multicast listener done */
|
|
|
|
|
|
|
|
#define ND_ROUTER_SOLICIT 133 /* router solicitation */
|
|
|
|
#define ND_ROUTER_ADVERT 134 /* router advertisment */
|
|
|
|
#define ND_NEIGHBOR_SOLICIT 135 /* neighbor solicitation */
|
|
|
|
#define ND_NEIGHBOR_ADVERT 136 /* neighbor advertisment */
|
|
|
|
#define ND_REDIRECT 137 /* redirect */
|
|
|
|
|
|
|
|
#define ICMP6_ROUTER_RENUMBERING 138 /* router renumbering */
|
|
|
|
|
2000-08-18 12:05:27 +00:00
|
|
|
#define ICMP6_WRUREQUEST 139 /* who are you request */
|
|
|
|
#define ICMP6_WRUREPLY 140 /* who are you reply */
|
|
|
|
#define ICMP6_FQDN_QUERY 139 /* FQDN query */
|
|
|
|
#define ICMP6_FQDN_REPLY 140 /* FQDN reply */
|
|
|
|
#define ICMP6_NI_QUERY 139 /* node information request */
|
|
|
|
#define ICMP6_NI_REPLY 140 /* node information reply */
|
1999-03-28 18:32:03 +00:00
|
|
|
|
2000-08-18 12:05:27 +00:00
|
|
|
/* The definitions below are experimental. TBA */
|
|
|
|
#define MLD6_MTRACE_RESP 141 /* mtrace response(to sender) */
|
|
|
|
#define MLD6_MTRACE 142 /* mtrace messages */
|
|
|
|
|
|
|
|
#define ICMP6_MAXTYPE 142
|
1999-03-28 18:32:03 +00:00
|
|
|
|
|
|
|
#define ICMP6_DST_UNREACH_NOROUTE 0 /* no route to destination */
|
|
|
|
#define ICMP6_DST_UNREACH_ADMIN 1 /* administratively prohibited */
|
2000-08-18 12:05:27 +00:00
|
|
|
#define ICMP6_DST_UNREACH_NOTNEIGHBOR 2 /* not a neighbor(obsolete) */
|
|
|
|
#define ICMP6_DST_UNREACH_BEYONDSCOPE 2 /* beyond scope of source address */
|
1999-03-28 18:32:03 +00:00
|
|
|
#define ICMP6_DST_UNREACH_ADDR 3 /* address unreachable */
|
|
|
|
#define ICMP6_DST_UNREACH_NOPORT 4 /* port unreachable */
|
|
|
|
|
|
|
|
#define ICMP6_TIME_EXCEED_TRANSIT 0 /* ttl==0 in transit */
|
|
|
|
#define ICMP6_TIME_EXCEED_REASSEMBLY 1 /* ttl==0 in reass */
|
|
|
|
|
|
|
|
#define ICMP6_PARAMPROB_HEADER 0 /* erroneous header field */
|
|
|
|
#define ICMP6_PARAMPROB_NEXTHEADER 1 /* unrecognized next header */
|
|
|
|
#define ICMP6_PARAMPROB_OPTION 2 /* unrecognized option */
|
|
|
|
|
|
|
|
#define ICMP6_INFOMSG_MASK 0x80 /* all informational messages */
|
|
|
|
|
2000-08-18 12:05:27 +00:00
|
|
|
#define ICMP6_NI_SUBJ_IPV6 0 /* Query Subject is an IPv6 address */
|
|
|
|
#define ICMP6_NI_SUBJ_FQDN 1 /* Query Subject is a Domain name */
|
|
|
|
#define ICMP6_NI_SUBJ_IPV4 2 /* Query Subject is an IPv4 address */
|
|
|
|
|
|
|
|
#define ICMP6_NI_SUCCESS 0 /* node information successful reply */
|
|
|
|
#define ICMP6_NI_REFUSED 1 /* node information request is refused */
|
|
|
|
#define ICMP6_NI_UNKNOWN 2 /* unknown Qtype */
|
|
|
|
|
1999-03-28 18:32:03 +00:00
|
|
|
#define ICMP6_ROUTER_RENUMBERING_COMMAND 0 /* rr command */
|
|
|
|
#define ICMP6_ROUTER_RENUMBERING_RESULT 1 /* rr result */
|
|
|
|
#define ICMP6_ROUTER_RENUMBERING_SEQNUM_RESET 255 /* rr seq num reset */
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Multicast Listener Discovery
|
|
|
|
*/
|
|
|
|
struct mld6_hdr {
|
|
|
|
struct icmp6_hdr mld6_hdr;
|
|
|
|
struct e_in6_addr mld6_addr; /* multicast address */
|
|
|
|
};
|
|
|
|
|
|
|
|
#define mld6_type mld6_hdr.icmp6_type
|
|
|
|
#define mld6_code mld6_hdr.icmp6_code
|
|
|
|
#define mld6_cksum mld6_hdr.icmp6_cksum
|
|
|
|
#define mld6_maxdelay mld6_hdr.icmp6_data16[0]
|
|
|
|
#define mld6_reserved mld6_hdr.icmp6_data16[1]
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Neighbor Discovery
|
|
|
|
*/
|
|
|
|
|
|
|
|
struct nd_router_solicit { /* router solicitation */
|
|
|
|
struct icmp6_hdr nd_rs_hdr;
|
|
|
|
/* could be followed by options */
|
|
|
|
};
|
|
|
|
|
|
|
|
#define nd_rs_type nd_rs_hdr.icmp6_type
|
|
|
|
#define nd_rs_code nd_rs_hdr.icmp6_code
|
|
|
|
#define nd_rs_cksum nd_rs_hdr.icmp6_cksum
|
|
|
|
#define nd_rs_reserved nd_rs_hdr.icmp6_data32[0]
|
|
|
|
|
|
|
|
struct nd_router_advert { /* router advertisement */
|
|
|
|
struct icmp6_hdr nd_ra_hdr;
|
|
|
|
guint32 nd_ra_reachable; /* reachable time */
|
|
|
|
guint32 nd_ra_retransmit; /* retransmit timer */
|
|
|
|
/* could be followed by options */
|
|
|
|
};
|
|
|
|
|
|
|
|
#define nd_ra_type nd_ra_hdr.icmp6_type
|
|
|
|
#define nd_ra_code nd_ra_hdr.icmp6_code
|
|
|
|
#define nd_ra_cksum nd_ra_hdr.icmp6_cksum
|
|
|
|
#define nd_ra_curhoplimit nd_ra_hdr.icmp6_data8[0]
|
|
|
|
#define nd_ra_flags_reserved nd_ra_hdr.icmp6_data8[1]
|
|
|
|
#define ND_RA_FLAG_MANAGED 0x80
|
|
|
|
#define ND_RA_FLAG_OTHER 0x40
|
2001-06-01 23:53:49 +00:00
|
|
|
#define ND_RA_FLAG_HOME_AGENT 0x20
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Router preference values based on draft-draves-ipngwg-router-selection-01.
|
|
|
|
* These are non-standard definitions.
|
|
|
|
*/
|
|
|
|
#define ND_RA_FLAG_RTPREF_MASK 0x18 /* 00011000 */
|
|
|
|
|
|
|
|
#define ND_RA_FLAG_RTPREF_HIGH 0x08 /* 00001000 */
|
|
|
|
#define ND_RA_FLAG_RTPREF_MEDIUM 0x00 /* 00000000 */
|
|
|
|
#define ND_RA_FLAG_RTPREF_LOW 0x18 /* 00011000 */
|
|
|
|
#define ND_RA_FLAG_RTPREF_RSV 0x10 /* 00010000 */
|
|
|
|
|
1999-03-28 18:32:03 +00:00
|
|
|
#define nd_ra_router_lifetime nd_ra_hdr.icmp6_data16[1]
|
|
|
|
|
|
|
|
struct nd_neighbor_solicit { /* neighbor solicitation */
|
|
|
|
struct icmp6_hdr nd_ns_hdr;
|
|
|
|
struct e_in6_addr nd_ns_target; /*target address */
|
|
|
|
/* could be followed by options */
|
|
|
|
};
|
|
|
|
|
|
|
|
#define nd_ns_type nd_ns_hdr.icmp6_type
|
|
|
|
#define nd_ns_code nd_ns_hdr.icmp6_code
|
|
|
|
#define nd_ns_cksum nd_ns_hdr.icmp6_cksum
|
|
|
|
#define nd_ns_reserved nd_ns_hdr.icmp6_data32[0]
|
|
|
|
|
|
|
|
struct nd_neighbor_advert { /* neighbor advertisement */
|
|
|
|
struct icmp6_hdr nd_na_hdr;
|
|
|
|
struct e_in6_addr nd_na_target; /* target address */
|
|
|
|
/* could be followed by options */
|
|
|
|
};
|
|
|
|
|
|
|
|
#define nd_na_type nd_na_hdr.icmp6_type
|
|
|
|
#define nd_na_code nd_na_hdr.icmp6_code
|
|
|
|
#define nd_na_cksum nd_na_hdr.icmp6_cksum
|
|
|
|
#define nd_na_flags_reserved nd_na_hdr.icmp6_data32[0]
|
|
|
|
#define ND_NA_FLAG_ROUTER 0x80000000
|
|
|
|
#define ND_NA_FLAG_SOLICITED 0x40000000
|
|
|
|
#define ND_NA_FLAG_OVERRIDE 0x20000000
|
|
|
|
|
|
|
|
struct nd_redirect { /* redirect */
|
|
|
|
struct icmp6_hdr nd_rd_hdr;
|
|
|
|
struct e_in6_addr nd_rd_target; /* target address */
|
|
|
|
struct e_in6_addr nd_rd_dst; /* destination address */
|
|
|
|
/* could be followed by options */
|
|
|
|
};
|
|
|
|
|
|
|
|
#define nd_rd_type nd_rd_hdr.icmp6_type
|
|
|
|
#define nd_rd_code nd_rd_hdr.icmp6_code
|
|
|
|
#define nd_rd_cksum nd_rd_hdr.icmp6_cksum
|
|
|
|
#define nd_rd_reserved nd_rd_hdr.icmp6_data32[0]
|
|
|
|
|
|
|
|
struct nd_opt_hdr { /* Neighbor discovery option header */
|
|
|
|
guint8 nd_opt_type;
|
|
|
|
guint8 nd_opt_len;
|
|
|
|
/* followed by option specific data*/
|
|
|
|
};
|
|
|
|
|
|
|
|
#define ND_OPT_SOURCE_LINKADDR 1
|
|
|
|
#define ND_OPT_TARGET_LINKADDR 2
|
|
|
|
#define ND_OPT_PREFIX_INFORMATION 3
|
|
|
|
#define ND_OPT_REDIRECTED_HEADER 4
|
|
|
|
#define ND_OPT_MTU 5
|
2001-06-01 23:53:49 +00:00
|
|
|
#define ND_OPT_ADVINTERVAL 7
|
|
|
|
#define ND_OPT_HOMEAGENT_INFO 8
|
2001-09-04 21:04:52 +00:00
|
|
|
#define ND_OPT_SOURCE_ADDRLIST 9
|
|
|
|
#define ND_OPT_TARGET_ADDRLIST 10
|
|
|
|
|
2001-06-01 23:53:49 +00:00
|
|
|
/* draft-ietf-ipngwg-router-preference, not officially assigned yet */
|
2001-09-04 21:04:52 +00:00
|
|
|
#define ND_OPT_ROUTE_INFO 200
|
|
|
|
/* draft-ietf-mobileip-hmipv6, not officially assigned yet */
|
|
|
|
#define ND_OPT_MAP 201
|
1999-03-28 18:32:03 +00:00
|
|
|
|
|
|
|
struct nd_opt_prefix_info { /* prefix information */
|
|
|
|
guint8 nd_opt_pi_type;
|
|
|
|
guint8 nd_opt_pi_len;
|
|
|
|
guint8 nd_opt_pi_prefix_len;
|
|
|
|
guint8 nd_opt_pi_flags_reserved;
|
|
|
|
guint32 nd_opt_pi_valid_time;
|
|
|
|
guint32 nd_opt_pi_preferred_time;
|
|
|
|
guint32 nd_opt_pi_reserved2;
|
|
|
|
struct e_in6_addr nd_opt_pi_prefix;
|
|
|
|
};
|
|
|
|
|
|
|
|
#define ND_OPT_PI_FLAG_ONLINK 0x80
|
|
|
|
#define ND_OPT_PI_FLAG_AUTO 0x40
|
2001-06-01 23:53:49 +00:00
|
|
|
#define ND_OPT_PI_FLAG_ROUTER 0x20
|
|
|
|
#define ND_OPT_PI_FLAG_SITEPREF 0x10
|
1999-03-28 18:32:03 +00:00
|
|
|
|
|
|
|
struct nd_opt_rd_hdr { /* redirected header */
|
|
|
|
guint8 nd_opt_rh_type;
|
|
|
|
guint8 nd_opt_rh_len;
|
|
|
|
guint16 nd_opt_rh_reserved1;
|
|
|
|
guint32 nd_opt_rh_reserved2;
|
|
|
|
/* followed by IP header and data */
|
|
|
|
};
|
|
|
|
|
|
|
|
struct nd_opt_mtu { /* MTU option */
|
|
|
|
guint8 nd_opt_mtu_type;
|
|
|
|
guint8 nd_opt_mtu_len;
|
|
|
|
guint16 nd_opt_mtu_reserved;
|
|
|
|
guint32 nd_opt_mtu_mtu;
|
|
|
|
};
|
2001-06-01 23:53:49 +00:00
|
|
|
|
2001-01-23 02:49:55 +00:00
|
|
|
struct nd_opt_adv_int { /* Advertisement Interval option */
|
|
|
|
guint8 nd_opt_adv_int_type;
|
|
|
|
guint8 nd_opt_adv_int_len;
|
|
|
|
guint16 nd_opt_adv_int_reserved;
|
|
|
|
guint32 nd_opt_adv_int_advint;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct nd_opt_ha_info { /* Home Agent Information option */
|
|
|
|
guint8 nd_opt_ha_info_type;
|
|
|
|
guint8 nd_opt_ha_info_len;
|
|
|
|
guint16 nd_opt_ha_info_reserved;
|
|
|
|
guint16 nd_opt_ha_info_ha_pref;
|
|
|
|
guint16 nd_opt_ha_info_ha_life;
|
|
|
|
};
|
1999-03-28 18:32:03 +00:00
|
|
|
|
2001-06-01 23:53:49 +00:00
|
|
|
struct nd_opt_route_info { /* route info */
|
|
|
|
guint8 nd_opt_rti_type;
|
|
|
|
guint8 nd_opt_rti_len;
|
|
|
|
guint8 nd_opt_rti_prefixlen;
|
|
|
|
guint8 nd_opt_rti_flags;
|
|
|
|
guint32 nd_opt_rti_lifetime;
|
|
|
|
/* prefix follows */
|
|
|
|
};
|
|
|
|
|
2001-09-04 21:04:52 +00:00
|
|
|
struct nd_opt_map_info { /* HMIPv6 MAP option */
|
|
|
|
guint8 nd_opt_map_type;
|
|
|
|
guint8 nd_opt_map_len;
|
2002-01-15 20:11:10 +00:00
|
|
|
guint8 nd_opt_map_dist_and_pref;
|
2001-09-04 21:04:52 +00:00
|
|
|
guint8 nd_opt_map_flags;
|
|
|
|
guint32 nd_opt_map_lifetime;
|
|
|
|
struct e_in6_addr nd_opt_map_address;
|
|
|
|
};
|
|
|
|
|
|
|
|
#define ND_OPT_MAP_FLAG_R 0x80
|
|
|
|
#define ND_OPT_MAP_FLAG_M 0x40
|
|
|
|
#define ND_OPT_MAP_FLAG_I 0x20
|
|
|
|
#define ND_OPT_MAP_FLAG_T 0x10
|
|
|
|
#define ND_OPT_MAP_FLAG_P 0x08
|
2002-01-15 20:11:10 +00:00
|
|
|
#define ND_OPT_MAP_FLAG_V 0x04
|
2001-09-04 21:04:52 +00:00
|
|
|
|
1999-03-28 18:32:03 +00:00
|
|
|
/*
|
2000-08-18 12:05:27 +00:00
|
|
|
* icmp6 node information
|
1999-03-28 18:32:03 +00:00
|
|
|
*/
|
2000-08-18 12:05:27 +00:00
|
|
|
struct icmp6_nodeinfo {
|
|
|
|
struct icmp6_hdr icmp6_ni_hdr;
|
|
|
|
guint8 icmp6_ni_nonce[8];
|
|
|
|
/* could be followed by reply data */
|
|
|
|
};
|
1999-03-28 18:32:03 +00:00
|
|
|
|
2000-08-18 12:05:27 +00:00
|
|
|
#define ni_type icmp6_ni_hdr.icmp6_type
|
|
|
|
#define ni_code icmp6_ni_hdr.icmp6_code
|
|
|
|
#define ni_cksum icmp6_ni_hdr.icmp6_cksum
|
|
|
|
#define ni_qtype icmp6_ni_hdr.icmp6_data16[0]
|
|
|
|
#define ni_flags icmp6_ni_hdr.icmp6_data16[1]
|
|
|
|
|
|
|
|
#define NI_QTYPE_NOOP 0 /* NOOP */
|
|
|
|
#define NI_QTYPE_SUPTYPES 1 /* Supported Qtypes */
|
|
|
|
#define NI_QTYPE_FQDN 2 /* FQDN (draft 04) */
|
|
|
|
#define NI_QTYPE_DNSNAME 2 /* DNS Name */
|
|
|
|
#define NI_QTYPE_NODEADDR 3 /* Node Addresses */
|
|
|
|
#define NI_QTYPE_IPV4ADDR 4 /* IPv4 Addresses */
|
|
|
|
|
|
|
|
#define NI_SUPTYPE_FLAG_COMPRESS 0x1
|
|
|
|
#define NI_FQDN_FLAG_VALIDTTL 0x1
|
|
|
|
|
|
|
|
#define NI_NODEADDR_FLAG_TRUNCATE 0x1
|
|
|
|
#define NI_NODEADDR_FLAG_ALL 0x2
|
|
|
|
#define NI_NODEADDR_FLAG_COMPAT 0x4
|
|
|
|
#define NI_NODEADDR_FLAG_LINKLOCAL 0x8
|
|
|
|
#define NI_NODEADDR_FLAG_SITELOCAL 0x10
|
|
|
|
#define NI_NODEADDR_FLAG_GLOBAL 0x20
|
|
|
|
#define NI_NODEADDR_FLAG_ANYCAST 0x40 /* just experimental. not in spec */
|
1999-03-28 18:32:03 +00:00
|
|
|
|
2000-08-18 12:05:27 +00:00
|
|
|
struct ni_reply_fqdn {
|
|
|
|
guint32 ni_fqdn_ttl; /* TTL */
|
|
|
|
guint8 ni_fqdn_namelen; /* length in octets of the FQDN */
|
|
|
|
guint8 ni_fqdn_name[3]; /* XXX: alignment */
|
|
|
|
};
|
|
|
|
|
1999-03-28 18:32:03 +00:00
|
|
|
/*
|
|
|
|
* Router Renumbering. as router-renum-05.txt
|
|
|
|
*/
|
|
|
|
struct icmp6_router_renum { /* router renumbering header */
|
|
|
|
struct icmp6_hdr rr_hdr;
|
|
|
|
guint8 rr_segnum;
|
2000-11-09 14:09:41 +00:00
|
|
|
guint8 rr_flags;
|
1999-03-28 18:32:03 +00:00
|
|
|
guint16 rr_maxdelay;
|
|
|
|
guint32 rr_reserved;
|
|
|
|
};
|
|
|
|
|
|
|
|
#define rr_type rr_hdr.icmp6_type
|
|
|
|
#define rr_code rr_hdr.icmp6_code
|
|
|
|
#define rr_cksum rr_hdr.icmp6_cksum
|
|
|
|
#define rr_seqnum rr_hdr.icmp6_data32[0]
|
|
|
|
|
|
|
|
struct rr_pco_match { /* match prefix part */
|
|
|
|
guint8 rpm_code;
|
|
|
|
guint8 rpm_len;
|
|
|
|
guint8 rpm_ordinal;
|
|
|
|
guint8 rpm_matchlen;
|
|
|
|
guint8 rpm_minlen;
|
|
|
|
guint8 rpm_maxlen;
|
|
|
|
guint16 rpm_reserved;
|
|
|
|
struct e_in6_addr rpm_prefix;
|
|
|
|
};
|
|
|
|
|
|
|
|
#define RPM_PCO_ADD 1
|
|
|
|
#define RPM_PCO_CHANGE 2
|
|
|
|
#define RPM_PCO_SETGLOBAL 3
|
|
|
|
#define RPM_PCO_MAX 4
|
|
|
|
|
|
|
|
struct rr_pco_use { /* use prefix part */
|
|
|
|
guint8 rpu_uselen;
|
|
|
|
guint8 rpu_keeplen;
|
2000-11-09 16:39:59 +00:00
|
|
|
guint8 rpu_ramask;
|
|
|
|
guint8 rpu_raflags;
|
1999-03-28 18:32:03 +00:00
|
|
|
guint32 rpu_vltime;
|
|
|
|
guint32 rpu_pltime;
|
2000-11-09 16:39:59 +00:00
|
|
|
guint32 rpu_flags;
|
1999-03-28 18:32:03 +00:00
|
|
|
struct e_in6_addr rpu_prefix;
|
|
|
|
};
|
|
|
|
|
2000-11-09 16:39:59 +00:00
|
|
|
#define ICMP6_RR_PCOUSE_RAFLAGS_ONLINK 0x80
|
|
|
|
#define ICMP6_RR_PCOUSE_RAFLAGS_AUTO 0x40
|
|
|
|
|
|
|
|
/* network endian */
|
|
|
|
#define ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME 0x80000000
|
|
|
|
#define ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME 0x40000000
|
|
|
|
|
1999-03-28 18:32:03 +00:00
|
|
|
struct rr_result { /* router renumbering result message */
|
2000-11-09 16:39:59 +00:00
|
|
|
guint16 rrr_flags;
|
1999-03-28 18:32:03 +00:00
|
|
|
guint8 rrr_ordinal;
|
|
|
|
guint8 rrr_matchedlen;
|
|
|
|
guint32 rrr_ifid;
|
|
|
|
struct e_in6_addr rrr_prefix;
|
|
|
|
};
|
2000-11-09 16:39:59 +00:00
|
|
|
|
|
|
|
/* network endian */
|
|
|
|
#define ICMP6_RR_RESULT_FLAGS_OOB 0x0002
|
|
|
|
#define ICMP6_RR_RESULT_FLAGS_FORBIDDEN 0x0001
|
1999-03-28 18:32:03 +00:00
|
|
|
|
|
|
|
#endif /* __PACKET_IPV6_H_DEFINED__ */
|