2 * Definitions for IPv6 packet disassembly
4 * $Id: packet-ipv6.h,v 1.21 2001/04/23 03:56:57 guy Exp $
6 * Ethereal - Network traffic analyzer
7 * By Gerald Combs <gerald@ethereal.com>
9 * Copyright 1998 Gerald Combs
11 * MobileIPv6 support added by Tomislav Borosa <tomislav.borosa@siemens.hr>
13 * This program is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU General Public License
15 * as published by the Free Software Foundation; either version 2
16 * of the License, or (at your option) any later version.
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
23 * You should have received a copy of the GNU General Public License
24 * along with this program; if not, write to the Free Software
25 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
28 #ifndef __PACKET_IPV6_H_DEFINED__
29 #define __PACKET_IPV6_H_DEFINED__
31 #include "ipv6-utils.h"
33 #define INET6_ADDRSTRLEN 46
36 * Definition for internet protocol version 6.
42 guint32 ip6_un1_flow; /* 20 bits of flow-ID */
43 guint16 ip6_un1_plen; /* payload length */
44 guint8 ip6_un1_nxt; /* next header */
45 guint8 ip6_un1_hlim; /* hop limit */
47 guint8 ip6_un2_vfc; /* 4 bits version, 4 bits class */
49 struct e_in6_addr ip6_src; /* source address */
50 struct e_in6_addr ip6_dst; /* destination address */
53 #define ip6_vfc ip6_ctlun.ip6_un2_vfc
54 #define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow
55 #define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen
56 #define ip6_nxt ip6_ctlun.ip6_un1.ip6_un1_nxt
57 #define ip6_hlim ip6_ctlun.ip6_un1.ip6_un1_hlim
58 #define ip6_hops ip6_ctlun.ip6_un1.ip6_un1_hlim
60 /* Offsets of fields within an IPv6 header. */
62 #define IP6H_CTL_FLOW 0
63 #define IP6H_CTL_PLEN 4
64 #define IP6H_CTL_NXT 6
65 #define IP6H_CTL_HLIM 7
66 #define IP6H_CTL_VFC 0
70 #define IPV6_FLOWINFO_MASK 0x0fffffff /* flow info (28 bits) */
71 #define IPV6_FLOWLABEL_MASK 0x000fffff /* flow label (20 bits) */
82 /* Hop-by-Hop options header */
83 /* XXX should we pad it to force alignment on an 8-byte boundary? */
85 guint8 ip6h_nxt; /* next header */
86 guint8 ip6h_len; /* length in units of 8 octets */
87 /* followed by options */
90 /* Destination options header */
91 /* XXX should we pad it to force alignment on an 8-byte boundary? */
93 guint8 ip6d_nxt; /* next header */
94 guint8 ip6d_len; /* length in units of 8 octets */
95 /* followed by options */
98 /* Option types and related macros */
99 #define IP6OPT_PAD1 0x00 /* 00 0 00000 */
100 #define IP6OPT_PADN 0x01 /* 00 0 00001 */
101 #define IP6OPT_JUMBO 0xC2 /* 11 0 00010 = 194 */
102 #define IP6OPT_JUMBO_LEN 6
103 #define IP6OPT_RTALERT 0x05 /* 00 0 00101 */
104 #define IP6OPT_RTALERT_LEN 4
105 #define IP6OPT_RTALERT_MLD 0 /* Datagram contains MLD message */
106 #define IP6OPT_RTALERT_RSVP 1 /* Datagram contains RSVP message */
107 #define IP6OPT_MINLEN 2
109 #define IP6OPT_TYPE(o) ((o) & 0xC0)
110 #define IP6OPT_TYPE_SKIP 0x00
111 #define IP6OPT_TYPE_DISCARD 0x40
112 #define IP6OPT_TYPE_FORCEICMP 0x80
113 #define IP6OPT_TYPE_ICMP 0xC0
115 #define IP6OPT_MUTABLE 0x20
117 /* BT INSERT BEGIN */
118 /* Mobile IP option types and sub-option types*/
119 #define IP6OPT_BINDING_UPDATE 0xC6 /* 11 0 00110 */
120 #define IP6OPT_BINDING_ACK 0x07 /* 00 0 00111 */
121 #define IP6OPT_BINDING_REQUEST 0x08 /* 00 0 01000 */
122 #define IP6OPT_HOME_ADDRESS 0xC9 /* 11 0 01001 */
123 #define IP6OPT_MIPv6_UNIQUE_ID_SUB 0x02 /* 00 0 00010 */
124 #define IP6OPT_MIPv6_ALTERNATIVE_COA_SUB 0x04 /* 00 0 00100 */
127 #define MIP_INFINITY 0xffffffff /* Infinity lifetime */
129 /* Binding Update Flags */
130 #define IP6_MIPv6_BU_A_FLAG 0x80 /* 1000 0000 - Acknowledge */
131 #define IP6_MIPv6_BU_H_FLAG 0x40 /* 0100 0000 - Home Registration */
132 #define IP6_MIPv6_BU_R_FLAG 0x20 /* 0010 0000 - Router */
133 #define IP6_MIPv6_BU_D_FLAG 0x10 /* 0001 0000 - Duplicate Address Detection */
134 #define IP6_MIPv6_BU_M_FLAG 0x8 /* 0000 1000 - MAP Registration */
135 #define IP6_MIPv6_BU_B_FLAG 0x4 /* 0000 0100 - Request for bicasting */
137 #define IP6_MIPv6_OPTION_TYPE_LENGTH 1
138 #define IP6_MIPv6_OPTION_LENGTH_LENGTH 1
139 #define IP6_MIPv6_FLAGS_LENGTH 1
140 #define IP6_MIPv6_PREFIX_LENGTH_LENGTH 1
141 #define IP6_MIPv6_SEQUENCE_NUMBER_LENGTH 2
142 #define IP6_MIPv6_LIFE_TIME_LENGTH 4
143 #define IP6_MIPv6_REFRESH_LENGTH 4
144 #define IP6_MIPv6_STATUS_LENGTH 1
145 #define IP6_MIPv6_HOME_ADDRESS_LENGTH 16
146 #define IP6_MIPv6_SUB_TYPE_LENGTH 1
147 #define IP6_MIPv6_SUB_LENGTH_LENGTH 1
148 #define IP6_MIPv6_SUB_UNIQUE_ID_LENGTH 2
149 #define IP6_MIPv6_SUB_ALTERNATIVE_COA_LENGTH 16
151 /* Binding Ackonwledgement Status */
152 #define BA_OK 0 /* Binding update accepted */
153 #define BA_REAS_UNSPEC 128 /*Reason unspecified */
154 #define BA_ADMIN_PROH 130 /* Administratively prohibited */
155 #define BA_INSUF_RES 131 /* Insufficient resources */
156 #define BA_NO_HR 132 /* Home registration not supported */
157 #define BA_NO_SUBNET 133 /* Not home subnet */
158 #define BA_ERR_ID_LEN 136 /* Incorrect interface identifier length */
159 #define BA_NO_HA 137 /* Not home agent for this mobile node */
160 #define BA_DUPL_ADDR 138 /* Duplicate Address Detection failed */
162 /* Binding Update flag description */
163 static const true_false_string ipv6_mipv6_bu_a_flag_value =
165 "Binding Acknowledgement requested",
166 "Binding Acknowledgement not requested"
168 static const true_false_string ipv6_mipv6_bu_h_flag_value =
171 "No Home Registration"
173 static const true_false_string ipv6_mipv6_bu_r_flag_value =
178 static const true_false_string ipv6_mipv6_bu_d_flag_value =
180 "Perform Duplicate Address Detection",
181 "Do not perform Duplicate Address Detection"
183 static const true_false_string ipv6_mipv6_bu_m_flag_value =
186 "No MAP Registration"
188 static const true_false_string ipv6_mipv6_bu_b_flag_value =
190 "Request for bicasting",
191 "Do not request for bicasting"
197 guint8 ip6r_nxt; /* next header */
198 guint8 ip6r_len; /* length in units of 8 octets */
199 guint8 ip6r_type; /* routing type */
200 guint8 ip6r_segleft; /* segments left */
201 /* followed by routing type specific data */
204 /* Type 0 Routing header */
206 guint8 ip6r0_nxt; /* next header */
207 guint8 ip6r0_len; /* length in units of 8 octets */
208 guint8 ip6r0_type; /* always zero */
209 guint8 ip6r0_segleft; /* segments left */
210 guint8 ip6r0_reserved; /* reserved field */
211 guint8 ip6r0_slmap[3]; /* strict/loose bit map */
212 struct e_in6_addr ip6r0_addr[1]; /* up to 23 addresses */
215 /* Fragment header */
217 guint8 ip6f_nxt; /* next header */
218 guint8 ip6f_reserved; /* reserved field */
219 guint16 ip6f_offlg; /* offset, reserved, and flag */
220 guint32 ip6f_ident; /* identification */
223 #define IP6F_OFF_MASK 0xfff8 /* mask out offset from _offlg */
224 #define IP6F_RESERVED_MASK 0x0006 /* reserved bits in ip6f_offlg */
225 #define IP6F_MORE_FRAG 0x0001 /* more-fragments flag */
228 * Definition for ICMPv6.
232 #define ICMPV6_PLD_MAXLEN 1232 /* IPV6_MMTU - sizeof(struct ip6_hdr)
233 - sizeof(struct icmp6_hdr) */
236 guint8 icmp6_type; /* type field */
237 guint8 icmp6_code; /* code field */
238 guint16 icmp6_cksum; /* checksum field */
240 guint32 icmp6_un_data32[1]; /* type-specific field */
241 guint16 icmp6_un_data16[2]; /* type-specific field */
242 guint8 icmp6_un_data8[4]; /* type-specific field */
246 #define icmp6_data32 icmp6_dataun.icmp6_un_data32
247 #define icmp6_data16 icmp6_dataun.icmp6_un_data16
248 #define icmp6_data8 icmp6_dataun.icmp6_un_data8
249 #define icmp6_pptr icmp6_data32[0] /* parameter prob */
250 #define icmp6_mtu icmp6_data32[0] /* packet too big */
251 #define icmp6_id icmp6_data16[0] /* echo request/reply */
252 #define icmp6_seq icmp6_data16[1] /* echo request/reply */
253 #define icmp6_maxdelay icmp6_data16[0] /* mcast group membership */
255 #define ICMP6_DST_UNREACH 1 /* dest unreachable, codes: */
256 #define ICMP6_PACKET_TOO_BIG 2 /* packet too big */
257 #define ICMP6_TIME_EXCEEDED 3 /* time exceeded, code: */
258 #define ICMP6_PARAM_PROB 4 /* ip6 header bad */
260 #define ICMP6_ECHO_REQUEST 128 /* echo service */
261 #define ICMP6_ECHO_REPLY 129 /* echo reply */
262 #define ICMP6_MEMBERSHIP_QUERY 130 /* group membership query */
263 #define MLD6_LISTENER_QUERY 130 /* multicast listener query */
264 #define ICMP6_MEMBERSHIP_REPORT 131 /* group membership report */
265 #define MLD6_LISTENER_REPORT 131 /* multicast listener report */
266 #define ICMP6_MEMBERSHIP_REDUCTION 132 /* group membership termination */
267 #define MLD6_LISTENER_DONE 132 /* multicast listener done */
269 #define ND_ROUTER_SOLICIT 133 /* router solicitation */
270 #define ND_ROUTER_ADVERT 134 /* router advertisment */
271 #define ND_NEIGHBOR_SOLICIT 135 /* neighbor solicitation */
272 #define ND_NEIGHBOR_ADVERT 136 /* neighbor advertisment */
273 #define ND_REDIRECT 137 /* redirect */
275 #define ICMP6_ROUTER_RENUMBERING 138 /* router renumbering */
277 #define ICMP6_WRUREQUEST 139 /* who are you request */
278 #define ICMP6_WRUREPLY 140 /* who are you reply */
279 #define ICMP6_FQDN_QUERY 139 /* FQDN query */
280 #define ICMP6_FQDN_REPLY 140 /* FQDN reply */
281 #define ICMP6_NI_QUERY 139 /* node information request */
282 #define ICMP6_NI_REPLY 140 /* node information reply */
284 /* The definitions below are experimental. TBA */
285 #define MLD6_MTRACE_RESP 141 /* mtrace response(to sender) */
286 #define MLD6_MTRACE 142 /* mtrace messages */
288 #define ICMP6_MAXTYPE 142
290 #define ICMP6_DST_UNREACH_NOROUTE 0 /* no route to destination */
291 #define ICMP6_DST_UNREACH_ADMIN 1 /* administratively prohibited */
292 #define ICMP6_DST_UNREACH_NOTNEIGHBOR 2 /* not a neighbor(obsolete) */
293 #define ICMP6_DST_UNREACH_BEYONDSCOPE 2 /* beyond scope of source address */
294 #define ICMP6_DST_UNREACH_ADDR 3 /* address unreachable */
295 #define ICMP6_DST_UNREACH_NOPORT 4 /* port unreachable */
297 #define ICMP6_TIME_EXCEED_TRANSIT 0 /* ttl==0 in transit */
298 #define ICMP6_TIME_EXCEED_REASSEMBLY 1 /* ttl==0 in reass */
300 #define ICMP6_PARAMPROB_HEADER 0 /* erroneous header field */
301 #define ICMP6_PARAMPROB_NEXTHEADER 1 /* unrecognized next header */
302 #define ICMP6_PARAMPROB_OPTION 2 /* unrecognized option */
304 #define ICMP6_INFOMSG_MASK 0x80 /* all informational messages */
306 #define ICMP6_NI_SUBJ_IPV6 0 /* Query Subject is an IPv6 address */
307 #define ICMP6_NI_SUBJ_FQDN 1 /* Query Subject is a Domain name */
308 #define ICMP6_NI_SUBJ_IPV4 2 /* Query Subject is an IPv4 address */
310 #define ICMP6_NI_SUCCESS 0 /* node information successful reply */
311 #define ICMP6_NI_REFUSED 1 /* node information request is refused */
312 #define ICMP6_NI_UNKNOWN 2 /* unknown Qtype */
314 #define ICMP6_ROUTER_RENUMBERING_COMMAND 0 /* rr command */
315 #define ICMP6_ROUTER_RENUMBERING_RESULT 1 /* rr result */
316 #define ICMP6_ROUTER_RENUMBERING_SEQNUM_RESET 255 /* rr seq num reset */
319 * Multicast Listener Discovery
322 struct icmp6_hdr mld6_hdr;
323 struct e_in6_addr mld6_addr; /* multicast address */
326 #define mld6_type mld6_hdr.icmp6_type
327 #define mld6_code mld6_hdr.icmp6_code
328 #define mld6_cksum mld6_hdr.icmp6_cksum
329 #define mld6_maxdelay mld6_hdr.icmp6_data16[0]
330 #define mld6_reserved mld6_hdr.icmp6_data16[1]
336 struct nd_router_solicit { /* router solicitation */
337 struct icmp6_hdr nd_rs_hdr;
338 /* could be followed by options */
341 #define nd_rs_type nd_rs_hdr.icmp6_type
342 #define nd_rs_code nd_rs_hdr.icmp6_code
343 #define nd_rs_cksum nd_rs_hdr.icmp6_cksum
344 #define nd_rs_reserved nd_rs_hdr.icmp6_data32[0]
346 struct nd_router_advert { /* router advertisement */
347 struct icmp6_hdr nd_ra_hdr;
348 guint32 nd_ra_reachable; /* reachable time */
349 guint32 nd_ra_retransmit; /* retransmit timer */
350 /* could be followed by options */
353 #define nd_ra_type nd_ra_hdr.icmp6_type
354 #define nd_ra_code nd_ra_hdr.icmp6_code
355 #define nd_ra_cksum nd_ra_hdr.icmp6_cksum
356 #define nd_ra_curhoplimit nd_ra_hdr.icmp6_data8[0]
357 #define nd_ra_flags_reserved nd_ra_hdr.icmp6_data8[1]
358 #define ND_RA_FLAG_MANAGED 0x80
359 #define ND_RA_FLAG_OTHER 0x40
360 #define nd_ra_router_lifetime nd_ra_hdr.icmp6_data16[1]
362 struct nd_neighbor_solicit { /* neighbor solicitation */
363 struct icmp6_hdr nd_ns_hdr;
364 struct e_in6_addr nd_ns_target; /*target address */
365 /* could be followed by options */
368 #define nd_ns_type nd_ns_hdr.icmp6_type
369 #define nd_ns_code nd_ns_hdr.icmp6_code
370 #define nd_ns_cksum nd_ns_hdr.icmp6_cksum
371 #define nd_ns_reserved nd_ns_hdr.icmp6_data32[0]
373 struct nd_neighbor_advert { /* neighbor advertisement */
374 struct icmp6_hdr nd_na_hdr;
375 struct e_in6_addr nd_na_target; /* target address */
376 /* could be followed by options */
379 #define nd_na_type nd_na_hdr.icmp6_type
380 #define nd_na_code nd_na_hdr.icmp6_code
381 #define nd_na_cksum nd_na_hdr.icmp6_cksum
382 #define nd_na_flags_reserved nd_na_hdr.icmp6_data32[0]
383 #define ND_NA_FLAG_ROUTER 0x80000000
384 #define ND_NA_FLAG_SOLICITED 0x40000000
385 #define ND_NA_FLAG_OVERRIDE 0x20000000
387 struct nd_redirect { /* redirect */
388 struct icmp6_hdr nd_rd_hdr;
389 struct e_in6_addr nd_rd_target; /* target address */
390 struct e_in6_addr nd_rd_dst; /* destination address */
391 /* could be followed by options */
394 #define nd_rd_type nd_rd_hdr.icmp6_type
395 #define nd_rd_code nd_rd_hdr.icmp6_code
396 #define nd_rd_cksum nd_rd_hdr.icmp6_cksum
397 #define nd_rd_reserved nd_rd_hdr.icmp6_data32[0]
399 struct nd_opt_hdr { /* Neighbor discovery option header */
402 /* followed by option specific data*/
405 #define ND_OPT_SOURCE_LINKADDR 1
406 #define ND_OPT_TARGET_LINKADDR 2
407 #define ND_OPT_PREFIX_INFORMATION 3
408 #define ND_OPT_REDIRECTED_HEADER 4
409 /* BT INSERT BEGIN */
410 #define ND_OPT_ADVERTISEMENT_INTERVAL 7
411 #define ND_OPT_HOME_AGENT_INFORMATION 8
415 struct nd_opt_prefix_info { /* prefix information */
416 guint8 nd_opt_pi_type;
417 guint8 nd_opt_pi_len;
418 guint8 nd_opt_pi_prefix_len;
419 guint8 nd_opt_pi_flags_reserved;
420 guint32 nd_opt_pi_valid_time;
421 guint32 nd_opt_pi_preferred_time;
422 guint32 nd_opt_pi_reserved2;
423 struct e_in6_addr nd_opt_pi_prefix;
426 #define ND_OPT_PI_FLAG_ONLINK 0x80
427 #define ND_OPT_PI_FLAG_AUTO 0x40
429 struct nd_opt_rd_hdr { /* redirected header */
430 guint8 nd_opt_rh_type;
431 guint8 nd_opt_rh_len;
432 guint16 nd_opt_rh_reserved1;
433 guint32 nd_opt_rh_reserved2;
434 /* followed by IP header and data */
437 struct nd_opt_mtu { /* MTU option */
438 guint8 nd_opt_mtu_type;
439 guint8 nd_opt_mtu_len;
440 guint16 nd_opt_mtu_reserved;
441 guint32 nd_opt_mtu_mtu;
443 /* BT INSERT BEGIN */
444 struct nd_opt_adv_int { /* Advertisement Interval option */
445 guint8 nd_opt_adv_int_type;
446 guint8 nd_opt_adv_int_len;
447 guint16 nd_opt_adv_int_reserved;
448 guint32 nd_opt_adv_int_advint;
451 struct nd_opt_ha_info { /* Home Agent Information option */
452 guint8 nd_opt_ha_info_type;
453 guint8 nd_opt_ha_info_len;
454 guint16 nd_opt_ha_info_reserved;
455 guint16 nd_opt_ha_info_ha_pref;
456 guint16 nd_opt_ha_info_ha_life;
461 * icmp6 node information
463 struct icmp6_nodeinfo {
464 struct icmp6_hdr icmp6_ni_hdr;
465 guint8 icmp6_ni_nonce[8];
466 /* could be followed by reply data */
469 #define ni_type icmp6_ni_hdr.icmp6_type
470 #define ni_code icmp6_ni_hdr.icmp6_code
471 #define ni_cksum icmp6_ni_hdr.icmp6_cksum
472 #define ni_qtype icmp6_ni_hdr.icmp6_data16[0]
473 #define ni_flags icmp6_ni_hdr.icmp6_data16[1]
475 #define NI_QTYPE_NOOP 0 /* NOOP */
476 #define NI_QTYPE_SUPTYPES 1 /* Supported Qtypes */
477 #define NI_QTYPE_FQDN 2 /* FQDN (draft 04) */
478 #define NI_QTYPE_DNSNAME 2 /* DNS Name */
479 #define NI_QTYPE_NODEADDR 3 /* Node Addresses */
480 #define NI_QTYPE_IPV4ADDR 4 /* IPv4 Addresses */
482 #define NI_SUPTYPE_FLAG_COMPRESS 0x1
483 #define NI_FQDN_FLAG_VALIDTTL 0x1
485 #define NI_NODEADDR_FLAG_TRUNCATE 0x1
486 #define NI_NODEADDR_FLAG_ALL 0x2
487 #define NI_NODEADDR_FLAG_COMPAT 0x4
488 #define NI_NODEADDR_FLAG_LINKLOCAL 0x8
489 #define NI_NODEADDR_FLAG_SITELOCAL 0x10
490 #define NI_NODEADDR_FLAG_GLOBAL 0x20
491 #define NI_NODEADDR_FLAG_ANYCAST 0x40 /* just experimental. not in spec */
493 struct ni_reply_fqdn {
494 guint32 ni_fqdn_ttl; /* TTL */
495 guint8 ni_fqdn_namelen; /* length in octets of the FQDN */
496 guint8 ni_fqdn_name[3]; /* XXX: alignment */
500 * Router Renumbering. as router-renum-05.txt
502 struct icmp6_router_renum { /* router renumbering header */
503 struct icmp6_hdr rr_hdr;
510 #define rr_type rr_hdr.icmp6_type
511 #define rr_code rr_hdr.icmp6_code
512 #define rr_cksum rr_hdr.icmp6_cksum
513 #define rr_seqnum rr_hdr.icmp6_data32[0]
515 struct rr_pco_match { /* match prefix part */
522 guint16 rpm_reserved;
523 struct e_in6_addr rpm_prefix;
526 #define RPM_PCO_ADD 1
527 #define RPM_PCO_CHANGE 2
528 #define RPM_PCO_SETGLOBAL 3
529 #define RPM_PCO_MAX 4
531 struct rr_pco_use { /* use prefix part */
539 struct e_in6_addr rpu_prefix;
542 #define ICMP6_RR_PCOUSE_RAFLAGS_ONLINK 0x80
543 #define ICMP6_RR_PCOUSE_RAFLAGS_AUTO 0x40
546 #define ICMP6_RR_PCOUSE_FLAGS_DECRVLTIME 0x80000000
547 #define ICMP6_RR_PCOUSE_FLAGS_DECRPLTIME 0x40000000
549 struct rr_result { /* router renumbering result message */
552 guint8 rrr_matchedlen;
554 struct e_in6_addr rrr_prefix;
558 #define ICMP6_RR_RESULT_FLAGS_OOB 0x0002
559 #define ICMP6_RR_RESULT_FLAGS_FORBIDDEN 0x0001
561 #endif /* __PACKET_IPV6_H_DEFINED__ */