aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-6lowpan.c
diff options
context:
space:
mode:
authorBill Meier <wmeier@newsguy.com>2009-10-04 17:50:39 +0000
committerBill Meier <wmeier@newsguy.com>2009-10-04 17:50:39 +0000
commitbb8fc20cd3491ce95e70272ea55e8ed73edfcfc3 (patch)
tree2a35dc9caa5388fa36e47cb6406581e0af535917 /epan/dissectors/packet-6lowpan.c
parent70d977764ccc1cd9a6587c93a72b8af4e15fbf89 (diff)
1. There doesn't seem to be a need for a separate .h file;
2. Move prototype declarations to after the struct declarations used by the prototypes. 3. Fix some typos. svn path=/trunk/; revision=30310
Diffstat (limited to 'epan/dissectors/packet-6lowpan.c')
-rw-r--r--epan/dissectors/packet-6lowpan.c184
1 files changed, 160 insertions, 24 deletions
diff --git a/epan/dissectors/packet-6lowpan.c b/epan/dissectors/packet-6lowpan.c
index a62db4d835..1d8101a4ca 100644
--- a/epan/dissectors/packet-6lowpan.c
+++ b/epan/dissectors/packet-6lowpan.c
@@ -36,8 +36,144 @@
#include <epan/in_cksum.h>
#include "epan/dissectors/packet-ipv6.h"
#include "epan/dissectors/packet-ieee802154.h"
-#include "packet-6lowpan.h"
+/* Definitions for 6lowpan packet disassembly structures and routines */
+
+/* 6LoWPAN Patterns */
+#define LOWPAN_PATTERN_NALP 0x00
+#define LOWPAN_PATTERN_NALP_BITS 2
+#define LOWPAN_PATTERN_IPV6 0x41
+#define LOWPAN_PATTERN_IPV6_BITS 8
+#define LOWPAN_PATTERN_HC1 0x42 /* Deprecated - replaced with IPHC. */
+#define LOWPAN_PATTERN_HC1_BITS 8
+#define LOWPAN_PATTERN_BC0 0x50
+#define LOWPAN_PATTERN_BC0_BITS 8
+#define LOWPAN_PATTERN_IPHC 0x03 /* See draft-ietf-6lowpan-hc-05.txt */
+#define LOWPAN_PATTERN_IPHC_BITS 3
+#define LOWPAN_PATTERN_ESC 0x7f
+#define LOWPAN_PATTERN_ESC_BITS 8
+#define LOWPAN_PATTERN_MESH 0x02
+#define LOWPAN_PATTERN_MESH_BITS 2
+#define LOWPAN_PATTERN_FRAG1 0x18
+#define LOWPAN_PATTERN_FRAGN 0x1c
+#define LOWPAN_PATTERN_FRAG_BITS 5
+
+/* 6LoWPAN HC1 Header */
+#define LOWPAN_HC1_SOURCE_PREFIX 0x80
+#define LOWPAN_HC1_SOURCE_IFC 0x40
+#define LOWPAN_HC1_DEST_PREFIX 0x20
+#define LOWPAN_HC1_DEST_IFC 0x10
+#define LOWPAN_HC1_TRAFFIC_CLASS 0x08
+#define LOWPAN_HC1_NEXT 0x06
+#define LOWPAN_HC1_MORE 0x01
+
+/* IPv6 header field lengths (in bits) */
+#define LOWPAN_IPV6_TRAFFIC_CLASS_BITS 8
+#define LOWPAN_IPV6_FLOW_LABEL_BITS 20
+#define LOWPAN_IPV6_NEXT_HEADER_BITS 8
+#define LOWPAN_IPV6_HOP_LIMIT_BITS 8
+#define LOWPAN_IPV6_PREFIX_BITS 64
+#define LOWPAN_IPV6_INTERFACE_BITS 64
+
+/* HC_UDP header field lengths (in bits). */
+#define LOWPAN_UDP_PORT_BITS 16
+#define LOWPAN_UDP_PORT_COMPRESSED_BITS 4
+#define LOWPAN_UDP_LENGTH_BITS 16
+#define LOWPAN_UDP_CHECKSUM_BITS 16
+
+/* HC1 Next Header compression modes. */
+#define LOWPAN_HC1_NEXT_NONE 0x00
+#define LOWPAN_HC1_NEXT_UDP 0x01
+#define LOWPAN_HC1_NEXT_ICMP 0x02
+#define LOWPAN_HC1_NEXT_TCP 0x03
+
+/* HC_UDP Header */
+#define LOWPAN_HC2_UDP_SRCPORT 0x80
+#define LOWPAN_HC2_UDP_DSTPORT 0x40
+#define LOWPAN_HC2_UDP_LENGTH 0x20
+#define LOWPAN_HC2_UDP_RESERVED 0x1f
+
+/* IPHC Base flags */
+#define LOWPAN_IPHC_FLAG_FLOW 0x1800
+#define LOWPAN_IPHC_FLAG_NHDR 0x0400
+#define LOWPAN_IPHC_FLAG_HLIM 0x0300
+#define LOWPAN_IPHC_FLAG_CONTEXT_ID 0x0080
+#define LOWPAN_IPHC_FLAG_SRC_COMP 0x0040
+#define LOWPAN_IPHC_FLAG_SRC_MODE 0x0030
+#define LOWPAN_IPHC_FLAG_MCAST_COMP 0x0008
+#define LOWPAN_IPHC_FLAG_DST_COMP 0x0004
+#define LOWPAN_IPHC_FLAG_DST_MODE 0x0003
+#define LOWPAN_IPHC_FLAG_SCI 0xf0
+#define LOWPAN_IPHC_FLAG_DCI 0x0f
+/* Offsets for extracting integer fields. */
+#define LOWPAN_IPHC_FLAG_OFFSET_FLOW 11
+#define LOWPAN_IPHC_FLAG_OFFSET_HLIM 8
+#define LOWPAN_IPHC_FLAG_OFFSET_SRC_MODE 4
+#define LOWPAN_IPHC_FLAG_OFFSET_DST_MODE 0
+
+/* IPHC Flow encoding values. */
+#define LOWPAN_IPHC_FLOW_CLASS_LABEL 0x0
+#define LOWPAN_IPHC_FLOW_ECN_LABEL 0x1
+#define LOWPAN_IPHC_FLOW_CLASS 0x2
+#define LOWPAN_IPHC_FLOW_COMPRESSED 0x3
+
+/* IPHC Hop limit encoding. */
+#define LOWPAN_IPHC_HLIM_INLINE 0x0
+#define LOWPAN_IPHC_HLIM_1 0x1
+#define LOWPAN_IPHC_HLIM_64 0x2
+#define LOWPAN_IPHC_HLIM_255 0x3
+
+/* IPHC address modes. */
+#define LOWPAN_IPHC_ADDR_FULL_INLINE 0x0
+#define LOWPAN_IPHC_ADDR_64BIT_INLINE 0x1
+#define LOWPAN_IPHC_ADDR_16BIT_INLINE 0x2
+#define LOWPAN_IPHC_ADDR_COMPRESSED 0x3
+
+/* IPHC Traffic class and flow label field sizes (in bits) */
+#define LOWPAN_IPHC_ECN_BITS 2
+#define LOWPAN_IPHC_DSCP_BITS 6
+#define LOWPAN_IPHC_LABEL_BITS 20
+/* Bitmasks for the reconstructed traffic class field. */
+#define LOWPAN_IPHC_TRAFFIC_ECN 0x03
+#define LOWPAN_IPHC_TRAFFIC_DSCP 0xfc
+
+/* NHC Patterns. */
+#define LOWPAN_NHC_PATTERN_EXT 0x0e
+#define LOWPAN_NHC_PATTERN_EXT_BITS 4
+#define LOWPAN_NHC_PATTERN_UDP 0x1e
+#define LOWPAN_NHC_PATTERN_UDP_BITS 5
+
+/* NHC Extension header fields. */
+#define LOWPAN_NHC_EXT_EID 0x0e
+#define LOWPAN_NHC_EXT_EID_OFFSET 1
+#define LOWPAN_NHC_EXT_NHDR 0x01
+
+#define LOWPAN_NHC_EID_HOP_BY_HOP 0x00
+#define LOWPAN_NHC_EID_ROUTING 0x01
+#define LOWPAN_NHC_EID_FRAGMENT 0x02
+#define LOWPAN_NHC_EID_DEST_OPTIONS 0x03
+#define LOWPAN_NHC_EID_MOBILITY 0x04
+#define LOWPAN_NHC_EID_IPV6 0x07
+
+/* NHC UDP fields. */
+#define LOWPAN_NHC_UDP_CHECKSUM 0x04
+#define LOWPAN_NHC_UDP_SRCPORT 0x02
+#define LOWPAN_NHC_UDP_DSTPORT 0x01
+
+/* 6LoWPAN Mesh Header */
+#define LOWPAN_MESH_HEADER_V 0x20
+#define LOWPAN_MESH_HEADER_F 0x10
+#define LOWPAN_MESH_HEADER_HOPS 0x0f
+
+/* 6LoWPAN First Fragment Header */
+#define LOWPAN_FRAG_DGRAM_SIZE_BITS 11
+
+/* Compressed port number offset. */
+#define LOWPAN_PORT_8BIT_OFFSET 0xf000
+#define LOWPAN_PORT_12BIT_OFFSET (LOWPAN_PORT_8BIT_OFFSET | 0xb0)
+
+/* 6LoWPAN interface identifier length. */
+#define LOWPAN_IFC_ID_LEN 8
/* Protocol fields handles. */
static int proto_6lowpan = -1;
static int hf_6lowpan_pattern = -1;
@@ -125,26 +261,6 @@ static gint ett_6lowpan_mesh_flags = -1;
static gint ett_6lowpan_frag = -1;
static gint ett_6lopwan_traffic_class = -1;
-/* Dissector prototypes */
-static void proto_init_6lowpan (void);
-static gboolean dissect_6lowpan_heur (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
-static void dissect_6lowpan (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
-static tvbuff_t * dissect_6lowpan_ipv6 (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
-static tvbuff_t * dissect_6lowpan_hc1 (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
-static tvbuff_t * dissect_6lowpan_bc0 (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
-static tvbuff_t * dissect_6lowpan_iphc (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
-static struct lowpan_nhdr * dissect_6lowpan_iphc_nhc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offset);
-static tvbuff_t * dissect_6lowpan_mesh (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
-static tvbuff_t * dissect_6lowpan_frag (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboolean first);
-static tvbuff_t * dissect_6lowpan_unknown (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
-
-/* Helper functions. */
-static gboolean lowpan_dlsrc_to_ifcid (packet_info *pinfo, guint8 *ifcid);
-static gboolean lowpan_dldst_to_ifcid (packet_info *pinfo, guint8 *ifcid);
-static void lowpan_addr16_to_ifcid (guint16 addr, guint16 pan, guint8 *ifcid);
-static tvbuff_t * lowpan_reassemble_ipv6 (struct ip6_hdr * ipv6, struct lowpan_nhdr * nhdr_list);
-static guint8 lowpan_parse_nhc_proto (tvbuff_t *tvb, gint offset);
-
/* Subdissector handles. */
static dissector_handle_t data_handle;
static dissector_handle_t ipv6_handle;
@@ -261,7 +377,7 @@ struct udp_hdr {
guint16 checksum;
};
-/* Structure used to store decompressed header chains until reaseembly. */
+/* Structure used to store decompressed header chains until reassembly. */
struct lowpan_nhdr {
/* List Linking */
struct lowpan_nhdr *next;
@@ -272,6 +388,26 @@ struct lowpan_nhdr {
guint8 hdr[];
};
+/* Dissector prototypes */
+static void proto_init_6lowpan (void);
+static gboolean dissect_6lowpan_heur (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
+static void dissect_6lowpan (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
+static tvbuff_t * dissect_6lowpan_ipv6 (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
+static tvbuff_t * dissect_6lowpan_hc1 (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
+static tvbuff_t * dissect_6lowpan_bc0 (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
+static tvbuff_t * dissect_6lowpan_iphc (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
+static struct lowpan_nhdr * dissect_6lowpan_iphc_nhc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offset);
+static tvbuff_t * dissect_6lowpan_mesh (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
+static tvbuff_t * dissect_6lowpan_frag (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboolean first);
+static tvbuff_t * dissect_6lowpan_unknown (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
+
+/* Helper functions. */
+static gboolean lowpan_dlsrc_to_ifcid (packet_info *pinfo, guint8 *ifcid);
+static gboolean lowpan_dldst_to_ifcid (packet_info *pinfo, guint8 *ifcid);
+static void lowpan_addr16_to_ifcid (guint16 addr, guint16 pan, guint8 *ifcid);
+static tvbuff_t * lowpan_reassemble_ipv6 (struct ip6_hdr * ipv6, struct lowpan_nhdr * nhdr_list);
+static guint8 lowpan_parse_nhc_proto (tvbuff_t *tvb, gint offset);
+
/*FUNCTION:------------------------------------------------------
* NAME
* lowpan_addr16_to_ifcid
@@ -1344,7 +1480,7 @@ dissect_6lowpan_iphc_nhc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gi
/* Parse the IPv6 extension header protocol. */
ext_proto = lowpan_parse_nhc_proto(tvb, offset);
- /* Create a tree for the IPv6 extnesion header. */
+ /* Create a tree for the IPv6 extension header. */
if (tree) {
ti = proto_tree_add_text(tree, tvb, 0, sizeof(guint16), "IPv6 extension header");
nhc_tree = proto_item_add_subtree(ti, ett_6lowpan_nhc_ext);
@@ -1925,7 +2061,7 @@ proto_register_6lowpan(void)
{ &hf_6lowpan_iphc_flag_sac,
{ "Source address compression", "6lowpan.iphc.sac", FT_BOOLEAN, 16, TFS(&lowpan_iphc_addr_compression), LOWPAN_IPHC_FLAG_SRC_COMP, NULL, HFILL }},
{ &hf_6lowpan_iphc_flag_sam,
- { "Source address mode", "6lowpan.iphc.sac", FT_UINT16, BASE_HEX, VALS(lowpan_iphc_addr_modes), LOWPAN_IPHC_FLAG_SRC_MODE, NULL, HFILL }},
+ { "Source address mode", "6lowpan.iphc.sam", FT_UINT16, BASE_HEX, VALS(lowpan_iphc_addr_modes), LOWPAN_IPHC_FLAG_SRC_MODE, NULL, HFILL }},
{ &hf_6lowpan_iphc_flag_mcast,
{ "Multicast address compression", "6lowpan.iphc.m", FT_BOOLEAN, 16, NULL, LOWPAN_IPHC_FLAG_MCAST_COMP, NULL, HFILL }},
{ &hf_6lowpan_iphc_flag_dac,