Forgot to remove one change only used for local testing from last checkin
[obnox/wireshark/wip.git] / packet-ipv6.h
index 1fc80f5ddc7fa50db89d72149ec254223aa89106..899dafb1ed24900ca1266378230bb1f1713efd62 100644 (file)
@@ -1,12 +1,16 @@
 /* packet-ipv6.h
  * Definitions for IPv6 packet disassembly 
  *
- * $Id: packet-ipv6.h,v 1.14 2000/11/09 14:09:41 itojun Exp $
+ * $Id: packet-ipv6.h,v 1.26 2002/01/21 07:36:35 guy Exp $
  *
  * Ethereal - Network traffic analyzer
- * By Gerald Combs <gerald@zing.org>
+ * By Gerald Combs <gerald@ethereal.com>
+ *
  * Copyright 1998 Gerald Combs
  *
+ * MobileIPv6 support added by Tomislav Borosa <tomislav.borosa@siemens.hr>
+ *
+ * HMIPv6 support added by Martti Kuparinen <martti.kuparinen@iki.fi>
  * 
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
 #ifndef __PACKET_IPV6_H_DEFINED__
 #define __PACKET_IPV6_H_DEFINED__
 
-void dissect_ipv6(const u_char *, int, frame_data *, proto_tree *);
-
-struct e_in6_addr {
-       union {
-               guint32  u6_addr32[4];
-               guint16  u6_addr16[8];
-               guint8   u6_addr8[16];
-       } u6_addr;                      /* 128 bit IP6 address */
-};
-
-#ifdef s6_addr32
-#undef s6_addr32
-#endif
-
-#ifdef s6_addr16
-#undef s6_addr16
-#endif
-
-#ifdef s6_addr8
-#undef s6_addr8
-#endif
-
-#ifdef s6_addr
-#undef s6_addr
-#endif
-
-#define s6_addr32 u6_addr.u6_addr32
-#define s6_addr16 u6_addr.u6_addr16
-#define s6_addr8  u6_addr.u6_addr8
-#define s6_addr   u6_addr.u6_addr8
+#include <epan/ipv6-utils.h>
 
 #define INET6_ADDRSTRLEN       46
 
@@ -94,13 +69,8 @@ struct ip6_hdr {
 #define        IP6H_SRC        8
 #define        IP6H_DST        24
 
-#ifdef WORDS_BIGENDIAN
 #define IPV6_FLOWINFO_MASK     0x0fffffff      /* flow info (28 bits) */
 #define IPV6_FLOWLABEL_MASK    0x000fffff      /* flow label (20 bits) */
-#else
-#define IPV6_FLOWINFO_MASK     0xffffff0f      /* flow info (28 bits) */
-#define IPV6_FLOWLABEL_MASK    0xffff0f00      /* flow label (20 bits) */
-#endif
 
 /*
  * Extension Headers
@@ -133,11 +103,21 @@ struct ip6_dest {
 #define IP6OPT_JUMBO           0xC2    /* 11 0 00010 = 194 */
 #define IP6OPT_JUMBO_LEN       6
 #define IP6OPT_RTALERT         0x05    /* 00 0 00101 */
+
 #define IP6OPT_RTALERT_LEN     4
 #define IP6OPT_RTALERT_MLD     0       /* Datagram contains MLD message */
 #define IP6OPT_RTALERT_RSVP    1       /* Datagram contains RSVP message */
+#define IP6OPT_RTALERT_ACTNET  2       /* contains an Active Networks msg */
 #define IP6OPT_MINLEN          2
 
+#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 */
+
 #define IP6OPT_TYPE(o)         ((o) & 0xC0)
 #define IP6OPT_TYPE_SKIP       0x00
 #define IP6OPT_TYPE_DISCARD    0x40
@@ -146,6 +126,42 @@ struct ip6_dest {
 
 #define IP6OPT_MUTABLE         0x20
 
+/* 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 */
+
 /* Routing header */
 struct ip6_rthdr {
        guint8  ip6r_nxt;       /* next header */
@@ -174,15 +190,9 @@ struct ip6_frag {
        guint32 ip6f_ident;             /* identification */
 };
 
-#if BYTE_ORDER == BIG_ENDIAN
 #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 */
-#else /* BYTE_ORDER == LITTLE_ENDIAN */
-#define IP6F_OFF_MASK          0xf8ff  /* mask out offset from _offlg */
-#define IP6F_RESERVED_MASK     0x0600  /* reserved bits in ip6f_offlg */
-#define IP6F_MORE_FRAG         0x0100  /* more-fragments flag */
-#endif /* BYTE_ORDER == LITTLE_ENDIAN */
 
 /*
  * Definition for ICMPv6.
@@ -317,6 +327,19 @@ struct nd_router_advert {  /* router advertisement */
 #define nd_ra_flags_reserved   nd_ra_hdr.icmp6_data8[1]
 #define ND_RA_FLAG_MANAGED     0x80
 #define ND_RA_FLAG_OTHER       0x40
+#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 */
+
 #define nd_ra_router_lifetime  nd_ra_hdr.icmp6_data16[1]
 
 struct nd_neighbor_solicit {   /* neighbor solicitation */
@@ -340,15 +363,9 @@ struct nd_neighbor_advert {        /* neighbor advertisement */
 #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]
-#if BYTE_ORDER == BIG_ENDIAN
 #define ND_NA_FLAG_ROUTER              0x80000000
 #define ND_NA_FLAG_SOLICITED           0x40000000
 #define ND_NA_FLAG_OVERRIDE            0x20000000
-#elif BYTE_ORDER == LITTLE_ENDIAN
-#define ND_NA_FLAG_ROUTER              0x80
-#define ND_NA_FLAG_SOLICITED           0x40
-#define ND_NA_FLAG_OVERRIDE            0x20
-#endif
 
 struct nd_redirect {           /* redirect */
        struct icmp6_hdr        nd_rd_hdr;
@@ -373,6 +390,15 @@ struct nd_opt_hdr {                /* Neighbor discovery option header */
 #define ND_OPT_PREFIX_INFORMATION      3
 #define ND_OPT_REDIRECTED_HEADER       4
 #define ND_OPT_MTU                     5
+#define ND_OPT_ADVINTERVAL             7
+#define ND_OPT_HOMEAGENT_INFO          8
+#define ND_OPT_SOURCE_ADDRLIST         9
+#define ND_OPT_TARGET_ADDRLIST         10
+
+/* draft-ietf-ipngwg-router-preference, not officially assigned yet */
+#define ND_OPT_ROUTE_INFO              200
+/* draft-ietf-mobileip-hmipv6, not officially assigned yet */
+#define ND_OPT_MAP                     201
 
 struct nd_opt_prefix_info {    /* prefix information */
        guint8  nd_opt_pi_type;
@@ -387,6 +413,8 @@ struct nd_opt_prefix_info { /* prefix information */
 
 #define ND_OPT_PI_FLAG_ONLINK          0x80
 #define ND_OPT_PI_FLAG_AUTO            0x40
+#define ND_OPT_PI_FLAG_ROUTER          0x20
+#define ND_OPT_PI_FLAG_SITEPREF                0x10
 
 struct nd_opt_rd_hdr {         /* redirected header */
        guint8  nd_opt_rh_type;
@@ -403,6 +431,46 @@ struct nd_opt_mtu {                /* MTU option */
        guint32 nd_opt_mtu_mtu;
 };
 
+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;
+};
+
+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 */
+};
+
+struct nd_opt_map_info {       /* HMIPv6 MAP option */
+       guint8                  nd_opt_map_type;
+       guint8                  nd_opt_map_len;
+       guint8                  nd_opt_map_dist_and_pref;
+       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
+#define ND_OPT_MAP_FLAG_V      0x04
+
 /*
  * icmp6 node information
  */
@@ -425,15 +493,9 @@ struct icmp6_nodeinfo {
 #define NI_QTYPE_NODEADDR      3 /* Node Addresses */
 #define NI_QTYPE_IPV4ADDR      4 /* IPv4 Addresses */
 
-#if BYTE_ORDER == BIG_ENDIAN
 #define NI_SUPTYPE_FLAG_COMPRESS       0x1
 #define NI_FQDN_FLAG_VALIDTTL          0x1
-#elif BYTE_ORDER == LITTLE_ENDIAN
-#define NI_SUPTYPE_FLAG_COMPRESS       0x0100
-#define NI_FQDN_FLAG_VALIDTTL          0x0100
-#endif
 
-#if BYTE_ORDER == BIG_ENDIAN
 #define NI_NODEADDR_FLAG_TRUNCATE      0x1
 #define NI_NODEADDR_FLAG_ALL           0x2
 #define NI_NODEADDR_FLAG_COMPAT                0x4
@@ -441,15 +503,6 @@ struct icmp6_nodeinfo {
 #define NI_NODEADDR_FLAG_SITELOCAL     0x10
 #define NI_NODEADDR_FLAG_GLOBAL                0x20
 #define NI_NODEADDR_FLAG_ANYCAST       0x40 /* just experimental. not in spec */
-#elif BYTE_ORDER == LITTLE_ENDIAN
-#define NI_NODEADDR_FLAG_TRUNCATE      0x0100
-#define NI_NODEADDR_FLAG_ALL           0x0200
-#define NI_NODEADDR_FLAG_COMPAT                0x0400
-#define NI_NODEADDR_FLAG_LINKLOCAL     0x0800
-#define NI_NODEADDR_FLAG_SITELOCAL     0x1000
-#define NI_NODEADDR_FLAG_GLOBAL                0x2000
-#define NI_NODEADDR_FLAG_ANYCAST       0x4000 /* just experimental. not in spec */
-#endif
 
 struct ni_reply_fqdn {
        guint32 ni_fqdn_ttl;    /* TTL */
@@ -489,66 +542,34 @@ struct rr_pco_match {             /* match prefix part */
 #define RPM_PCO_SETGLOBAL      3
 #define RPM_PCO_MAX            4
 
-#if BYTE_ORDER == BIG_ENDIAN /* net byte order */
-struct rr_pco_use {            /* use prefix part */
-       guint8  rpu_uselen;
-       guint8  rpu_keeplen;
-       guint32 rpu_mask_onlink : 1;
-       guint32 rpu_mask_autonomous : 1;
-       guint32 rpu_mask_reserved : 6;
-       guint32 rpu_onlink : 1;
-       guint32 rpu_autonomous : 1;
-       guint32 rpu_raflags_reserved : 6;
-       guint32 rpu_vltime;
-       guint32 rpu_pltime;
-       guint32 rpu_decr_vltime : 1;
-       guint32 rpu_decr_pltime : 1;
-       guint32 rpu_flags_reserved : 6;
-       guint32 rpu_reserved : 24;
-       struct e_in6_addr rpu_prefix;
-};
-#elif BYTE_ORDER == LITTLE_ENDIAN
 struct rr_pco_use {            /* use prefix part */
        guint8  rpu_uselen;
        guint8  rpu_keeplen;
-       guint32 rpu_mask_reserved : 6;
-       guint32 rpu_mask_autonomous : 1;
-       guint32 rpu_mask_onlink : 1;
-       guint32 rpu_raflags_reserved : 6;
-       guint32 rpu_autonomous : 1;
-       guint32 rpu_onlink : 1;
+       guint8  rpu_ramask;
+       guint8  rpu_raflags;
        guint32 rpu_vltime;
        guint32 rpu_pltime;
-       guint32 rpu_flags_reserved : 6;
-       guint32 rpu_decr_pltime : 1;
-       guint32 rpu_decr_vltime : 1;
-       guint32 rpu_reserved : 24;
+       guint32 rpu_flags;
        struct e_in6_addr rpu_prefix;
 };
-#endif /* BYTE_ORDER */
 
-#if BYTE_ORDER == BIG_ENDIAN /* net byte order */
-struct rr_result {             /* router renumbering result message */
-       guint8  rrr_reserved;
-       guint32 rrr_flags_reserved : 6;
-       guint32 rrr_outofbound : 1;
-       guint32 rrr_forbidden : 1;
-       guint8  rrr_ordinal;
-       guint8  rrr_matchedlen;
-       guint32 rrr_ifid;
-       struct e_in6_addr rrr_prefix;
-};
-#elif BYTE_ORDER == LITTLE_ENDIAN
+#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
+
 struct rr_result {             /* router renumbering result message */
-       guint8  rrr_reserved;
-       guint32 rrr_forbidden : 1;
-       guint32 rrr_outofbound : 1;
-       guint32 rrr_flags_reserved : 6;
+       guint16 rrr_flags;
        guint8  rrr_ordinal;
        guint8  rrr_matchedlen;
        guint32 rrr_ifid;
        struct e_in6_addr rrr_prefix;
 };
-#endif /* BYTE_ORDER */
+
+/* network endian */
+#define ICMP6_RR_RESULT_FLAGS_OOB              0x0002
+#define ICMP6_RR_RESULT_FLAGS_FORBIDDEN                0x0001
 
 #endif /* __PACKET_IPV6_H_DEFINED__ */