diff options
author | Jonathan Munoz <jonathan.munoz@inria.fr> | 2017-06-30 16:57:07 +0200 |
---|---|---|
committer | Michael Mann <mmann78@netscape.net> | 2017-07-08 21:41:02 +0000 |
commit | a3b47316eb4f668e0ec92f9339bd914d28f934ff (patch) | |
tree | d05e7453aca259f7a7fd1cf87740de87cbb7de8d /epan/dissectors/packet-6lowpan.c | |
parent | 474f344df7ba7ea203fa728f32b48e08a0b2d39c (diff) |
6LoWPAN: added dissection for 6LoRH. (RFC8138, RFC8025)
Change-Id: I13396077ec7f3ec4fe9cfea9b3bd03305a5ee332
Reviewed-on: https://code.wireshark.org/review/22484
Reviewed-by: Michael Mann <mmann78@netscape.net>
Diffstat (limited to 'epan/dissectors/packet-6lowpan.c')
-rw-r--r-- | epan/dissectors/packet-6lowpan.c | 387 |
1 files changed, 386 insertions, 1 deletions
diff --git a/epan/dissectors/packet-6lowpan.c b/epan/dissectors/packet-6lowpan.c index 01d997eb08..0585380b91 100644 --- a/epan/dissectors/packet-6lowpan.c +++ b/epan/dissectors/packet-6lowpan.c @@ -59,6 +59,47 @@ void proto_reg_handoff_6lowpan(void); #define LOWPAN_PATTERN_FRAGN 0x1c #define LOWPAN_PATTERN_FRAG_BITS 5 +/* RFC8025 and RFC8138 */ +#define LOWPAN_PATTERN_PAGING_DISPATCH 0xf +#define LOWPAN_PATTERN_PAGING_DISPATCH_BITS 4 +#define LOWPAN_PATTERN_6LORHC 0x04 +#define LOWPAN_PATTERN_6LORHE 0x05 +#define LOWPAN_PATTERN_6LORHE_CLASS 0xe000 +#define LOWPAN_PATTERN_6LORHE_CLASS_BITS 13 +#define LOWPAN_PATTERN_6LORHE_LENGTH 0x1f00 +#define LOWPAN_PATTERN_6LORHE_LENGTH_BITS 8 +#define LOWPAN_PATTERN_6LORHE_TYPE 0x00ff +#define LOWPAN_PATTERN_6LORH_TYPE0 0x00 +#define LOWPAN_PATTERN_6LORH_TYPE1 0x01 +#define LOWPAN_PATTERN_6LORH_TYPE2 0x02 +#define LOWPAN_PATTERN_6LORH_TYPE3 0x03 +#define LOWPAN_PATTERN_6LORH_TYPE4 0x04 +#define LOWPAN_PATTERN_6LORH_TYPE5 0x05 +#define LOWPAN_PATTERN_6LORH_TYPE6 0x06 +#define LOWPAN_PATTERN_6LORH_TYPE15 0x0F +#define LOWPAN_PATTERN_6LORH_TYPE16 0x10 +#define LOWPAN_PATTERN_6LORH_TYPE17 0x11 +#define LOWPAN_PATTERN_6LORH_TYPE18 0x12 +#define LOWPAN_PATTERN_6LORH_TYPE19 0x13 +#define LOWPAN_5_RPI_BIT_O 0x1000 +#define LOWPAN_5_RPI_BIT_R 0x0800 +#define LOWPAN_5_RPI_BIT_F 0x0400 +#define LOWPAN_5_RPI_BIT_I 0x0200 +#define LOWPAN_5_RPI_BIT_K 0x0100 +#define LOWPAN_5_RPI_BITS_IK 0x0300 +#define LOWPAN_6LORH_GENERAL_FORMAT 0x8000 +#define LOWPAN_IP_IN_IP_6LORH 6 +#define BITS_IK_0 0 +#define BITS_IK_1 1 +#define BITS_IK_2 2 +#define BITS_IK_3 3 +#define BITS_IK_4 4 +#define IPV6_ADDR_COMPRESSED_1_BYTE 0 +#define IPV6_ADDR_COMPRESSED_2_BYTE 1 +#define IPV6_ADDR_COMPRESSED_4_BYTE 2 +#define IPV6_ADDR_COMPRESSED_8_BYTE 3 +#define IPV6_ADDR_COMPRESSED_16_BYTE 4 + /* 6LoWPAN HC1 Header */ #define LOWPAN_HC1_SOURCE_PREFIX 0x80 #define LOWPAN_HC1_SOURCE_IFC 0x40 @@ -217,6 +258,30 @@ static int hf_6lowpan_hc2_udp_src = -1; static int hf_6lowpan_hc2_udp_dst = -1; static int hf_6lowpan_hc2_udp_len = -1; +/* 6loRH */ +static int hf_6lowpan_pagenb = -1; +static int hf_6lowpan_routing_header = -1; +static int hf_6lowpan_6lorhe_length = -1; +static int hf_6lowpan_6lorhe_size = -1; +static int hf_6lowpan_6lorhc_size = -1; +static int hf_6lowpan_6lorhe_type = -1; +static int hf_6lowpan_6lorhe_hoplimit = -1; +static int hf_6lowpan_6lorhe_bitmap = -1; +static int hf_6lowpan_5_bit_o = -1; +static int hf_6lowpan_5_bit_r = -1; +static int hf_6lowpan_5_bit_f = -1; +static int hf_6lowpan_5_bit_i = -1; +static int hf_6lowpan_5_bit_k = -1; +static int hf_6lowpan_sender_rank1 = -1; +static int hf_6lowpan_sender_rank2 = -1; +static int hf_6lowpan_rpl_instance = -1; +static int hf_6lowpan_6lorhc_address_hop0 = -1; +static int hf_6lowpan_6lorhc_address_hop2 = -1; +static int hf_6lowpan_6lorhc_address_hop3 = -1; +static int hf_6lowpan_6lorhc_address_hop4 = -1; +static int hf_6lowpan_6lorhc_address_hop1 = -1; +static int hf_6lowpan_6lorhc_address_src = -1; + /* IPHC header field. */ static int hf_6lowpan_iphc_flag_tf = -1; static int hf_6lowpan_iphc_flag_nhdr = -1; @@ -286,6 +351,7 @@ static gint ett_6lowpan_hc1 = -1; static gint ett_6lowpan_hc1_encoding = -1; static gint ett_6lowpan_hc2_udp = -1; static gint ett_6lowpan_iphc = -1; +static gint ett_lowpan_routing_header_dispatch = -1; static gint ett_6lowpan_nhc_ext = -1; static gint ett_6lowpan_nhc_udp = -1; static gint ett_6lowpan_bcast = -1; @@ -396,6 +462,36 @@ static const value_string lowpan_udp_ports [] = { { LOWPAN_NHC_UDP_PORT_12BIT, "12 bits of both ports elided" }, { 0, NULL } }; +/* 6loRH */ +static const value_string lowpan_patterns_rh_type [] = { + { LOWPAN_PATTERN_6LORH_TYPE0, "Routing Header 3, 1 byte compression" }, + { LOWPAN_PATTERN_6LORH_TYPE1, "Routing Header 3, 2 byte compression" }, + { LOWPAN_PATTERN_6LORH_TYPE2, "Routing Header 3, 4 byte compression" }, + { LOWPAN_PATTERN_6LORH_TYPE3, "Routing Header 3, 8 byte compression" }, + { LOWPAN_PATTERN_6LORH_TYPE4, "Routing Header 3, 16 byte compression" }, + { LOWPAN_PATTERN_6LORH_TYPE5, "Routing Protocol Information" }, + { LOWPAN_PATTERN_6LORH_TYPE6, "IP in IP" }, + { LOWPAN_PATTERN_6LORH_TYPE15, "BIER Header, bit-by-bit encoding, no control fields, 32 bits word size" }, + { LOWPAN_PATTERN_6LORH_TYPE16, "BIER Header, Bloom filter encoding, 2* 1-byte HashID control fields, 32 bits word size" }, + { LOWPAN_PATTERN_6LORH_TYPE17, "BIER Header, bit-by-bit encoding, no control fields, 128 bits word size" }, + { LOWPAN_PATTERN_6LORH_TYPE18, "BIER Header, Bloom filter encoding, 8* 1-byte HashID control fields, 128 bits word size" }, + { LOWPAN_PATTERN_6LORH_TYPE19, "BIER Header, bit-by-bit encoding, 1-byte GroupID control fields, 128 bits word size" }, + { 0, NULL } +}; +static const value_string lowpan_patterns_rh [] = { + { LOWPAN_PATTERN_6LORHC, "Critical Routing Header" }, + { LOWPAN_PATTERN_6LORHE, "Elective Routing Header" }, + { 0, NULL } +}; +static const true_false_string bit_I_RPL = { + "Elided (RPL Instance ID: 0)", + "Present" +}; +static const true_false_string bit_K_RPL = { + "1 byte", + "2 bytes" +}; + /* Reassembly Data */ static int hf_6lowpan_fragments = -1; static int hf_6lowpan_fragment = -1; @@ -502,6 +598,8 @@ static tvbuff_t * dissect_6lowpan_mesh (tvbuff_t *tvb, packet_info *pin static tvbuff_t * dissect_6lowpan_frag_first (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, const guint8 *siid, const guint8 *diid); static tvbuff_t * dissect_6lowpan_frag_middle (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); static void dissect_6lowpan_unknown (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); +static tvbuff_t * dissect_6lowpan_6loRH (tvbuff_t *tvb, guint offset, proto_tree *tree); + /* Helper functions. */ static gboolean lowpan_dlsrc_to_ifcid (packet_info *pinfo, guint8 *ifcid); @@ -1004,6 +1102,7 @@ dissect_6lowpan(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data proto_tree *lowpan_tree; proto_item *lowpan_root; tvbuff_t *next = tvb; + guint offset = 0; /* Interface identifier of the encapsulating layer. */ guint8 src_iid[LOWPAN_IFC_ID_LEN]; guint8 dst_iid[LOWPAN_IFC_ID_LEN]; @@ -1041,6 +1140,17 @@ dissect_6lowpan(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data else if (tvb_get_bits8(next, 0, LOWPAN_PATTERN_IPV6_BITS) == LOWPAN_PATTERN_IPV6) { next = dissect_6lowpan_ipv6(next, pinfo, lowpan_tree); } + else if (tvb_get_bits8(next, 0, LOWPAN_PATTERN_PAGING_DISPATCH_BITS) == LOWPAN_PATTERN_PAGING_DISPATCH) { + proto_tree_add_bits_item(lowpan_tree, hf_6lowpan_pagenb, tvb, 4, 4, ENC_BIG_ENDIAN); + offset += 1; + next = dissect_6lowpan_6loRH(next, offset, lowpan_tree); + if (tvb_get_bits8(next, 0, LOWPAN_PATTERN_IPHC_BITS) == LOWPAN_PATTERN_IPHC) { + next = dissect_6lowpan_iphc(next, pinfo, lowpan_tree, -1, src_iid, dst_iid); + } + if (tvb_get_bits8(next, 0, LOWPAN_PATTERN_HC1_BITS) == LOWPAN_PATTERN_HC1) { + next = dissect_6lowpan_hc1(next, pinfo, lowpan_tree, -1, src_iid, dst_iid); + } + } /* Compressed IPv6 packets. */ else if (tvb_get_bits8(next, 0, LOWPAN_PATTERN_HC1_BITS) == LOWPAN_PATTERN_HC1) { next = dissect_6lowpan_hc1(next, pinfo, lowpan_tree, -1, src_iid, dst_iid); @@ -1063,6 +1173,212 @@ dissect_6lowpan(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data /*FUNCTION:------------------------------------------------------ * NAME + * dissect_6lowpan_6loRH + * DESCRIPTION + * Dissector routine for 6loRH fields in 6LoWPAN packets. + * PARAMETERS + * tvb ; packet buffer. + * offset ; offset of the 6loRH fields + * tree ; protocol display tree. + * RETURNS + * tvbuff_t * ; The remaining payload to be parsed. + *--------------------------------------------------------------- + */ +static tvbuff_t * +dissect_6lowpan_6loRH(tvbuff_t *tvb, guint offset, proto_tree *tree) +{ + + guint16 check; + gint IK; + guint16 loRH_flags; + proto_tree * loRH_tree; + guint16 loRHE_length; + guint8 loRHE_type; + guint16 loRHE_class; + guint8 rpl_instance; + gint condition = 1; + gint16 loRHE_unitnums; + + struct ws_ip6_hdr ipv6; + const gint *bits_RHC[] = { + &hf_6lowpan_5_bit_o, + &hf_6lowpan_5_bit_r, + &hf_6lowpan_5_bit_f, + &hf_6lowpan_5_bit_i, + &hf_6lowpan_5_bit_k, + NULL + }; + + loRH_flags = tvb_get_ntohs(tvb, offset); + check = loRH_flags & 0xC000; + + if (check == LOWPAN_6LORH_GENERAL_FORMAT) { + + memset(&ipv6.ip6h_src, 0, sizeof(ipv6.ip6h_src)); + + while(condition > 0){ + condition -= 1 ; + /*Create the tree*/ + loRH_tree = proto_tree_add_subtree(tree, tvb, offset, 2, ett_lowpan_routing_header_dispatch, NULL, "6LoRH:"); + + /* Get and display the pattern. */ + proto_tree_add_bits_item(loRH_tree, hf_6lowpan_routing_header, tvb, 8*offset, LOWPAN_PATTERN_IPHC_BITS, ENC_BIG_ENDIAN); + /*===================================================== + * Parse 6LoRH Header flags. + *===================================================== + */ + + loRHE_class = (loRH_flags & LOWPAN_PATTERN_6LORHE_CLASS) >> LOWPAN_PATTERN_6LORHE_CLASS_BITS; + loRHE_length = (loRH_flags & LOWPAN_PATTERN_6LORHE_LENGTH) >> LOWPAN_PATTERN_6LORHE_LENGTH_BITS; + loRHE_unitnums = loRHE_length + 1; + loRHE_type = (loRH_flags & LOWPAN_PATTERN_6LORHE_TYPE); + IK = (loRH_flags & LOWPAN_5_RPI_BITS_IK) >> 8; + + proto_item_append_text(loRH_tree, " %s", val_to_str_const(loRHE_type, lowpan_patterns_rh_type, "Unknown")); + + if (tree) { + switch (loRHE_class){ + case (LOWPAN_PATTERN_6LORHE):/*Elective Routing Header*/ + condition = 1 ; + if (loRHE_type >= 15) { /* BIER implementation */ + proto_tree_add_uint (loRH_tree, hf_6lowpan_6lorhe_size, tvb, offset, 2, loRH_flags & LOWPAN_PATTERN_6LORHE_LENGTH); + proto_tree_add_uint (loRH_tree, hf_6lowpan_6lorhe_type, tvb, offset, 2, loRHE_type); + offset += 2 ; + if (loRHE_type == 15) { + for (int i=0; i<loRHE_unitnums; i++) { + proto_tree_add_item(loRH_tree, hf_6lowpan_6lorhe_bitmap, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + } + } + } + else if (loRHE_type == LOWPAN_IP_IN_IP_6LORH) { + memset(&ipv6.ip6h_src, 0, sizeof(ipv6.ip6h_src)); + proto_tree_add_item(loRH_tree, hf_6lowpan_6lorhe_length, tvb, offset, 2, + loRH_flags & LOWPAN_PATTERN_6LORHE_LENGTH); + proto_tree_add_item(loRH_tree, hf_6lowpan_6lorhe_type, tvb, offset, 2, + loRHE_type); + proto_tree_add_item(loRH_tree, hf_6lowpan_6lorhe_hoplimit, tvb, offset + 2, 1, ENC_BIG_ENDIAN); + + if (loRHE_length > 1) { + for (int i = 0; i < 16; ++i) { + ipv6.ip6h_src.bytes[i] = tvb_get_guint8(tvb, offset + 3 + i); + } + proto_tree_add_ipv6(loRH_tree, hf_6lowpan_6lorhc_address_src, tvb, offset + 3, 16, + &ipv6.ip6h_src); + } + offset += 2 + loRHE_length; + } + break; /* case LOWPAN_PATTERN_6LORHE */ + + case (LOWPAN_PATTERN_6LORHC): /*Critical Routing Header*/ + condition = 1 ; + if (loRHE_type == 5){ + proto_tree_add_bitmask_list (loRH_tree, tvb, offset, 2, bits_RHC, ENC_NA); + proto_tree_add_item (loRH_tree, hf_6lowpan_6lorhe_type, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + switch (IK){ + case BITS_IK_0: + proto_tree_add_item (loRH_tree, hf_6lowpan_rpl_instance, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item (loRH_tree, hf_6lowpan_sender_rank2, tvb, offset+1, 2, ENC_BIG_ENDIAN); + offset += 3; + break; + case BITS_IK_1: + proto_tree_add_item (loRH_tree, hf_6lowpan_rpl_instance, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item (loRH_tree, hf_6lowpan_sender_rank1, tvb, offset+1, 1, ENC_BIG_ENDIAN); + offset += 2; + break; + case BITS_IK_2: + rpl_instance = 0x00; + proto_tree_add_uint (loRH_tree, hf_6lowpan_rpl_instance, tvb, offset, 0, rpl_instance); + proto_tree_add_item (loRH_tree, hf_6lowpan_sender_rank2, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + break; + case BITS_IK_3: + rpl_instance = 0x00; + proto_tree_add_uint (loRH_tree, hf_6lowpan_rpl_instance, tvb, offset, 0, rpl_instance); + proto_tree_add_item (loRH_tree, hf_6lowpan_sender_rank1, tvb, offset, 1, ENC_BIG_ENDIAN); + offset +=1; + break; + } + } + else if (loRHE_type <= 4){ + memset(&ipv6.ip6h_src, 0, sizeof(ipv6.ip6h_src)); + proto_tree_add_uint (loRH_tree, hf_6lowpan_6lorhc_size, tvb, offset, 2, loRH_flags & LOWPAN_PATTERN_6LORHE_LENGTH); + proto_tree_add_uint (loRH_tree, hf_6lowpan_6lorhe_type, tvb, offset, 2, loRHE_type); + offset += 2 ; + switch (loRHE_type){ + case IPV6_ADDR_COMPRESSED_1_BYTE: /* IPv6 address compressed to 1 byte */ + for (int i=0; i<loRHE_unitnums; i++) { + for (int j = 0; j < 1; j++){ + ipv6.ip6h_src.bytes[15-j] = tvb_get_guint8(tvb, offset); + } + proto_tree_add_ipv6(tree, hf_6lowpan_6lorhc_address_hop0, tvb, offset, 1, &ipv6.ip6h_src); + offset +=1; + } + break; + + case IPV6_ADDR_COMPRESSED_2_BYTE: /* IPv6 address compressed to 2 bytes */ + for (int i=0; i<loRHE_unitnums; i++) { + for (int j = 0; j < 2; ++j){ + ipv6.ip6h_src.bytes[15-1+j] = tvb_get_guint8(tvb, offset); + offset +=1; + } + proto_tree_add_ipv6(tree, hf_6lowpan_6lorhc_address_hop1, tvb, offset - 2, 2, &ipv6.ip6h_src); + } + break; + + case IPV6_ADDR_COMPRESSED_4_BYTE: /* IPv6 address compressed to 4 bytes */ + for (int i=0; i<loRHE_unitnums; i++) { + for (int j = 0; j < 4; j++){ + ipv6.ip6h_src.bytes[15-3+j] = tvb_get_guint8(tvb, offset); + offset +=1; + } + proto_tree_add_ipv6(tree, hf_6lowpan_6lorhc_address_hop2, tvb, offset - 4, 4, &ipv6.ip6h_src); + } + break; + + case IPV6_ADDR_COMPRESSED_8_BYTE: /* IPv6 address compressed to 8 bytes */ + for (int i=0; i<loRHE_unitnums; i++) { + for (int j = 0; j < 8; j++){ + ipv6.ip6h_src.bytes[15-7+j] = tvb_get_guint8(tvb, offset); + offset +=1; + } + proto_tree_add_ipv6(tree, hf_6lowpan_6lorhc_address_hop3, tvb, offset - 8, 8, &ipv6.ip6h_src); + } + break; + case IPV6_ADDR_COMPRESSED_16_BYTE: /* IPv6 address compressed to 16 bytes */ + for (int i=0; i<loRHE_unitnums; i++) { + for (int j = 0; j < 16; j++){ + ipv6.ip6h_src.bytes[j] = tvb_get_guint8(tvb, offset); + offset +=1; + } + proto_tree_add_ipv6(tree, hf_6lowpan_6lorhc_address_hop4, tvb, offset - 16, 16, &ipv6.ip6h_src); + } + break; /**/ + } /* switch loRHE_type */ + } /* else if (loRHE_type <= 4) */ + break; /* case LOWPAN_PATTERN_6LORHC */ + + default: + condition -= 1 ; + break; + } /* switch loRHE_class */ + } /* if tree*/ + loRH_flags = tvb_get_ntohs(tvb, offset); + loRHE_class = (loRH_flags & LOWPAN_PATTERN_6LORHE_CLASS) >> 13; + + if ((loRHE_class) != LOWPAN_PATTERN_6LORHE){ + if ((loRHE_class) != LOWPAN_PATTERN_6LORHC){ + condition -= 1; + } + } + } /* while (condition > 0)*/ + } + return tvb_new_subset_remaining(tvb, offset); +} /* dissect_6lowpan_6loRH */ + +/*FUNCTION:------------------------------------------------------ + * NAME * dissect_6lowpan_ipv6 * DESCRIPTION * Dissector routine for an uncompressed IPv6 header type. @@ -2840,7 +3156,75 @@ proto_register_6lowpan(void) FT_FRAMENUM, BASE_NONE, NULL, 0x00, NULL, HFILL }}, { &hf_6lowpan_reassembled_length, { "Reassembled 6LoWPAN length", "6lowpan.reassembled.length", - FT_UINT32, BASE_DEC, NULL, 0x00, NULL, HFILL }} + FT_UINT32, BASE_DEC, NULL, 0x00, NULL, HFILL }}, + + /* 6loRH fields */ + { &hf_6lowpan_6lorhc_address_src, + { "Encapsulator Address", "6lowpan.src", + FT_IPv6, BASE_NONE, NULL, 0x0, "Source IPv6 address", HFILL }}, + { &hf_6lowpan_6lorhc_address_hop0, + { "Source/15, Delta", "6lowpan.src", + FT_IPv6, BASE_NONE, NULL, 0x0, "Source IPv6 address", HFILL }}, + { &hf_6lowpan_6lorhc_address_hop1, + { "Source/14, Delta", "6lowpan.src", + FT_IPv6, BASE_NONE, NULL, 0x0, "Source IPv6 address", HFILL }}, + { &hf_6lowpan_6lorhc_address_hop2, + { "Source/12, Delta", "6lowpan.src", + FT_IPv6, BASE_NONE, NULL, 0x0, "Source IPv6 address", HFILL }}, + { &hf_6lowpan_6lorhc_address_hop3, + { "Source/8, Delta", "6lowpan.src", + FT_IPv6, BASE_NONE, NULL, 0x0, "Source IPv6 address", HFILL }}, + { &hf_6lowpan_6lorhc_address_hop4, + { "Source/0 Delta", "6lowpan.src", + FT_IPv6, BASE_NONE, NULL, 0x0, "Source IPv6 address", HFILL }}, + { &hf_6lowpan_sender_rank1, + { "Sender Rank", "6lowpan.sender.rank", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + { &hf_6lowpan_sender_rank2, + { "Sender Rank", "6lowpan.sender.rank", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + { &hf_6lowpan_rpl_instance, + { "RPL Instance", "6lowpan.rpl.instance", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + { &hf_6lowpan_5_bit_o, + { "Packet direction (bit O)", "6lowpan.6loRH.bitO", + FT_BOOLEAN, 16, TFS(&tfs_down_up), LOWPAN_5_RPI_BIT_O, NULL, HFILL }}, + { &hf_6lowpan_5_bit_r, + { "Rank-Error (bit R)", "6lowpan.6loRH.bitR", + FT_BOOLEAN, 16, TFS(&tfs_yes_no), LOWPAN_5_RPI_BIT_R, NULL, HFILL }}, + { &hf_6lowpan_5_bit_f, + { "Forwarding-Error (bit F)", "6lowpan.6loRH.bitF", + FT_BOOLEAN, 16, TFS(&tfs_yes_no), LOWPAN_5_RPI_BIT_F, NULL, HFILL }}, + { &hf_6lowpan_5_bit_i, + { "RPL Instance (bit I)", "6lowpan.6loRH.bitI", + FT_BOOLEAN, 16, TFS(&bit_I_RPL), LOWPAN_5_RPI_BIT_I, NULL, HFILL }}, + { &hf_6lowpan_5_bit_k, + { "Sender Rank Compression size (bit K)", "6lowpan.6loRH.bitK", + FT_BOOLEAN, 16, TFS(&bit_K_RPL), LOWPAN_5_RPI_BIT_K, NULL, HFILL }}, + { &hf_6lowpan_6lorhe_hoplimit, + { "6loRH Hop Limit", "6lowpan.rhhop.limit", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + { &hf_6lowpan_6lorhe_bitmap, + { "6loRH BIER Bitmap", "6lowpan.bitmap", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + { &hf_6lowpan_6lorhe_type, + { "6loRH Type", "6lowpan.rhtype", + FT_UINT16, BASE_HEX, VALS(lowpan_patterns_rh_type), LOWPAN_PATTERN_6LORHE_TYPE, NULL, HFILL }}, + { &hf_6lowpan_6lorhc_size, + { "6loRH Hop Number-1", "6lowpan.HopNuevo", + FT_UINT16, BASE_HEX, NULL, LOWPAN_PATTERN_6LORHE_LENGTH, NULL, HFILL }}, + { &hf_6lowpan_6lorhe_size, + { "6loRH Bitmap Word Number-1", "6lowpan.WordNuevo", + FT_UINT16, BASE_HEX, NULL, LOWPAN_PATTERN_6LORHE_LENGTH, NULL, HFILL }}, + { &hf_6lowpan_6lorhe_length, + { "6loRH Elective Length", "6lowpan.rhElength", + FT_UINT16, BASE_DEC, NULL, LOWPAN_PATTERN_6LORHE_LENGTH, NULL, HFILL }}, + { &hf_6lowpan_routing_header, + { "Routing Header 6lo", "6lowpan.routingheader", + FT_UINT8, BASE_HEX, VALS(lowpan_patterns_rh), 0x0, NULL, HFILL }}, + { &hf_6lowpan_pagenb, + { "Page Number", "6lowpan.pagenb", + FT_UINT16, 16, NULL, 0x0, NULL, HFILL }} }; static gint *ett[] = { @@ -2849,6 +3233,7 @@ proto_register_6lowpan(void) &ett_6lowpan_hc1_encoding, &ett_6lowpan_hc2_udp, &ett_6lowpan_iphc, + &ett_lowpan_routing_header_dispatch, &ett_6lowpan_nhc_ext, &ett_6lowpan_nhc_udp, &ett_6lowpan_bcast, |