static void dissect_dmx_chan(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { col_set_str(pinfo->cinfo, COL_PROTOCOL, "DMX Channels"); col_clear(pinfo->cinfo, COL_INFO); if (tree != NULL) { static const char *chan_format[] = { "%2u%% ", "0x%02x ", "%3u " }; static const char *string_format[] = { "0x%03x: %s", "%3u: %s" }; wmem_strbuf_t *chan_str = wmem_strbuf_new_label(wmem_packet_scope()); proto_item *item; guint16 length,r,c,row_count; guint8 v; guint offset = 0; proto_tree *ti = proto_tree_add_item(tree, proto_dmx_chan, tvb, offset, -1, ENC_NA); proto_tree *dmx_chan_tree = proto_item_add_subtree(ti, ett_dmx_chan); length = tvb_reported_length_remaining(tvb, offset); row_count = (length / global_disp_col_count) + ((length % global_disp_col_count) == 0 ? 0 : 1); for (r = 0; r < row_count;r++) { wmem_strbuf_truncate(chan_str, 0); for (c = 0;(c < global_disp_col_count) && (((r * global_disp_col_count) + c) < length);c++) { if ((global_disp_col_count >= 2) && ((c % (global_disp_col_count / 2)) == 0)) { wmem_strbuf_append(chan_str, " "); } v = tvb_get_guint8(tvb, (offset + (r * global_disp_col_count) + c)); if (global_disp_chan_val_type == 0) { v = (v * 100) / 255; if (v == 100) { wmem_strbuf_append(chan_str, "FL "); } else { wmem_strbuf_append_printf(chan_str, chan_format[global_disp_chan_val_type], v); } } else { wmem_strbuf_append_printf(chan_str, chan_format[global_disp_chan_val_type], v); } } proto_tree_add_none_format(dmx_chan_tree, hf_dmx_chan_output_dmx_data, tvb, offset+(r * global_disp_col_count), c, string_format[global_disp_chan_nr_type], (r * global_disp_col_count) + 1, wmem_strbuf_get_str(chan_str)); } /* Add the real type hidden */ item = proto_tree_add_item(dmx_chan_tree, hf_dmx_chan_output_data_filter, tvb, offset, length, ENC_NA ); PROTO_ITEM_SET_HIDDEN(item); } }
/* Neighbor list is of the form: * HID_1 NUM_1 HA_11 HA_12 ... HA_1NUM_1 * HID_2 NUM_2 HA_21 HA_22 ... HA_2NUM_2 * ... * HID_count NUM_count HA_count1 HA_count2 ... HA_countNUM_count * * count == hid_count. */ static void dissect_nwp_nl(tvbuff_t *tvb, proto_tree *nwp_tree, guint8 hid_count, guint8 ha_len) { proto_tree *neigh_list_tree = NULL; proto_tree *neigh_tree = NULL; proto_item *pi = NULL; guint i; guint8 offset = NWPH_NLST; wmem_strbuf_t *hid_buf = wmem_strbuf_sized_new(wmem_packet_scope(), NWP_HID_STR_LEN, NWP_HID_STR_LEN); /* Set up tree for neighbor list. */ pi = proto_tree_add_item(nwp_tree, hf_nwp_neigh_list, tvb, NWPH_NLST, -1, ENC_NA); neigh_list_tree = proto_item_add_subtree(pi, ett_nwp_neigh_list_tree); for (i = 0; i < hid_count; i++) { const gchar *hid_str; guint j; guint8 ha_count = tvb_get_guint8(tvb, offset + NWP_XID_LEN); /* Set up tree for this individual neighbor. */ pi = proto_tree_add_none_format(neigh_list_tree, hf_nwp_neigh, tvb, offset, NWP_XID_LEN + 1 + ha_len * ha_count, "Neighbor %d", i + 1); neigh_tree = proto_item_add_subtree(pi, ett_nwp_neigh_tree); /* Add HID for this neighbor. */ wmem_strbuf_append(hid_buf, "hid-"); add_hid_to_strbuf(tvb, hid_buf, offset); hid_str = wmem_strbuf_get_str(hid_buf); proto_tree_add_string(neigh_tree, hf_nwp_neigh_hid, tvb, offset, NWP_XID_LEN, hid_str); wmem_strbuf_truncate(hid_buf, 0); offset += NWP_XID_LEN; /* Add number of devices this neighbor has. */ proto_tree_add_item(neigh_tree, hf_nwp_neigh_num, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; /* Add hardware addresses for the neighbor's devices. */ for (j = 0; j < ha_count; j++) proto_tree_add_item(neigh_tree, hf_nwp_neigh_haddr, tvb, offset + (j * ha_len), ha_len, ENC_NA); offset += ha_len * ha_count; } }
static int dissect_reason(tvbuff_t *tvb, int offset, proto_tree *tree) { if (tree) { guint32 reason = tvb_get_ntohl(tvb, offset); proto_item *reason_item = proto_tree_add_item(tree, hf_vxi11_core_reason, tvb, offset, 4, ENC_BIG_ENDIAN); if (reason_item) { proto_tree *reason_tree = proto_item_add_subtree(reason_item, ett_vxi11_core_reason); proto_tree_add_item(reason_tree, hf_vxi11_core_reason_req_cnt, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(reason_tree, hf_vxi11_core_reason_chr, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(reason_tree, hf_vxi11_core_reason_end, tvb, offset, 4, ENC_BIG_ENDIAN); if (reason != 0) { wmem_strbuf_t *strbuf = wmem_strbuf_new_label(wmem_packet_scope()); if (reason & VXI11_CORE_REASON_REQCNT) { wmem_strbuf_append(strbuf, "REQ_CNT, "); } if (reason & VXI11_CORE_REASON_CHR) { wmem_strbuf_append(strbuf, "CHR, "); } if (reason & VXI11_CORE_REASON_END) { wmem_strbuf_append(strbuf, "END, "); } wmem_strbuf_truncate(strbuf, wmem_strbuf_get_len(strbuf) - 2); proto_item_append_text(reason_item, " (%s)", wmem_strbuf_get_str(strbuf)); } } } return offset + 4; }
static int dissect_flags(tvbuff_t *tvb, int offset, proto_tree *tree) { if (tree) { guint32 flags = tvb_get_ntohl(tvb, offset); proto_item *flags_item = proto_tree_add_item(tree, hf_vxi11_core_flags, tvb, offset, 4, ENC_BIG_ENDIAN); if (flags_item) { proto_tree *flags_tree = proto_item_add_subtree(flags_item, ett_vxi11_core_flags); proto_tree_add_item(flags_tree, hf_vxi11_core_flag_wait_lock, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(flags_tree, hf_vxi11_core_flag_end, tvb, offset, 4, ENC_BIG_ENDIAN); proto_tree_add_item(flags_tree, hf_vxi11_core_flag_term_chr_set, tvb, offset, 4, ENC_BIG_ENDIAN); if (flags != 0) { wmem_strbuf_t *strbuf = wmem_strbuf_new_label(wmem_packet_scope()); if (flags & VXI11_CORE_FLAG_WAITLOCK) { wmem_strbuf_append(strbuf, "WAIT_LOCK, "); } if (flags & VXI11_CORE_FLAG_END) { wmem_strbuf_append(strbuf, "END, "); } if (flags & VXI11_CORE_FLAG_TERMCHRSET) { wmem_strbuf_append(strbuf, "TERM_CHR_SET, "); } wmem_strbuf_truncate(strbuf, wmem_strbuf_get_len(strbuf) - 2); proto_item_append_text(flags_item, " (%s)", wmem_strbuf_get_str(strbuf)); } } } return offset + 4; }
static void dissect_nwp_ann(tvbuff_t *tvb, proto_tree *nwp_tree, guint8 hid_count, guint8 ha_len) { proto_tree *hid_tree = NULL; proto_item *ti = NULL; wmem_strbuf_t *buf; guint i; guint8 offset; /* Add hardware address. */ proto_tree_add_item(nwp_tree, hf_nwp_ann_haddr, tvb, NWPH_HWAD, ha_len, ENC_NA); /* Add tree for HIDs. */ ti = proto_tree_add_item(nwp_tree, hf_nwp_ann_hids, tvb, NWPH_HWAD + ha_len, hid_count * NWP_XID_LEN, ENC_NA); hid_tree = proto_item_add_subtree(ti, ett_nwp_ann_hid_tree); buf = wmem_strbuf_sized_new(wmem_packet_scope(), NWP_HID_STR_LEN, NWP_HID_STR_LEN); /* Add HIDs. */ offset = NWPH_HWAD + ha_len; for (i = 0; i < hid_count; i++) { const gchar *hid_str; wmem_strbuf_append(buf, "hid-"); add_hid_to_strbuf(tvb, buf, offset); hid_str = wmem_strbuf_get_str(buf); proto_tree_add_string_format(hid_tree, hf_nwp_ann_hid, tvb, offset, NWP_XID_LEN, hid_str, "%s", hid_str); wmem_strbuf_truncate(buf, 0); offset += NWP_XID_LEN; } }
static void wmem_test_strbuf(void) { wmem_allocator_t *allocator; wmem_strbuf_t *strbuf; int i; char *str; allocator = wmem_allocator_new(WMEM_ALLOCATOR_STRICT); strbuf = wmem_strbuf_new(allocator, "TEST"); g_assert(strbuf); g_assert_cmpstr(wmem_strbuf_get_str(strbuf), ==, "TEST"); g_assert(wmem_strbuf_get_len(strbuf) == 4); wmem_strbuf_append(strbuf, "FUZZ"); g_assert_cmpstr(wmem_strbuf_get_str(strbuf), ==, "TESTFUZZ"); g_assert(wmem_strbuf_get_len(strbuf) == 8); wmem_strbuf_append_printf(strbuf, "%d%s", 3, "a"); g_assert_cmpstr(wmem_strbuf_get_str(strbuf), ==, "TESTFUZZ3a"); g_assert(wmem_strbuf_get_len(strbuf) == 10); wmem_strbuf_append_c(strbuf, 'q'); g_assert_cmpstr(wmem_strbuf_get_str(strbuf), ==, "TESTFUZZ3aq"); g_assert(wmem_strbuf_get_len(strbuf) == 11); wmem_strbuf_append_unichar(strbuf, g_utf8_get_char("\xC2\xA9")); g_assert_cmpstr(wmem_strbuf_get_str(strbuf), ==, "TESTFUZZ3aq\xC2\xA9"); g_assert(wmem_strbuf_get_len(strbuf) == 13); wmem_strbuf_truncate(strbuf, 32); wmem_strbuf_truncate(strbuf, 24); wmem_strbuf_truncate(strbuf, 16); wmem_strbuf_truncate(strbuf, 13); g_assert_cmpstr(wmem_strbuf_get_str(strbuf), ==, "TESTFUZZ3aq\xC2\xA9"); g_assert(wmem_strbuf_get_len(strbuf) == 13); wmem_strbuf_truncate(strbuf, 3); g_assert_cmpstr(wmem_strbuf_get_str(strbuf), ==, "TES"); g_assert(wmem_strbuf_get_len(strbuf) == 3); strbuf = wmem_strbuf_sized_new(allocator, 10, 10); g_assert(strbuf); g_assert_cmpstr(wmem_strbuf_get_str(strbuf), ==, ""); g_assert(wmem_strbuf_get_len(strbuf) == 0); wmem_strbuf_append(strbuf, "FUZZ"); g_assert_cmpstr(wmem_strbuf_get_str(strbuf), ==, "FUZZ"); g_assert(wmem_strbuf_get_len(strbuf) == 4); wmem_strbuf_append_printf(strbuf, "%d%s", 3, "abcdefghijklmnop"); g_assert_cmpstr(wmem_strbuf_get_str(strbuf), ==, "FUZZ3abcd"); g_assert(wmem_strbuf_get_len(strbuf) == 9); wmem_strbuf_append(strbuf, "abcdefghijklmnopqrstuvwxyz"); g_assert_cmpstr(wmem_strbuf_get_str(strbuf), ==, "FUZZ3abcd"); g_assert(wmem_strbuf_get_len(strbuf) == 9); wmem_strbuf_append_c(strbuf, 'q'); g_assert_cmpstr(wmem_strbuf_get_str(strbuf), ==, "FUZZ3abcd"); g_assert(wmem_strbuf_get_len(strbuf) == 9); wmem_strbuf_append_unichar(strbuf, g_utf8_get_char("\xC2\xA9")); g_assert_cmpstr(wmem_strbuf_get_str(strbuf), ==, "FUZZ3abcd"); g_assert(wmem_strbuf_get_len(strbuf) == 9); str = wmem_strbuf_finalize(strbuf); g_assert_cmpstr(str, ==, "FUZZ3abcd"); g_assert(strlen(str) == 9); wmem_free_all(allocator); strbuf = wmem_strbuf_new(allocator, "TEST"); for (i=0; i<1024; i++) { if (g_test_rand_bit()) { wmem_strbuf_append(strbuf, "ABC"); } else { wmem_strbuf_append_printf(strbuf, "%d%d", 3, 777); } wmem_strict_check_canaries(allocator); } g_assert(strlen(wmem_strbuf_get_str(strbuf)) == wmem_strbuf_get_len(strbuf)); wmem_destroy_allocator(allocator); }
static void dissect_nstrace(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { proto_tree *ns_tree = NULL, *flagtree = NULL; proto_item *ti = NULL, *flagitem = NULL; struct nstr_phdr *pnstr = &(pinfo->pseudo_header->nstr); tvbuff_t *next_tvb_eth_client; guint8 offset; guint i, bpos; wmem_strbuf_t *flags_strbuf = wmem_strbuf_new_label(wmem_packet_scope()); static const gchar *flags[] = {"FP", "FR", "DFD", "SRSS", "RSSH"}; gboolean first_flag = TRUE; guint8 flagoffset, flagval; guint8 src_vmname_len = 0, dst_vmname_len = 0; guint8 variable_ns_len = 0; guint flagval32; wmem_strbuf_append(flags_strbuf, "None"); if (pnstr->rec_type == NSPR_HEADER_VERSION205) { src_vmname_len = tvb_get_guint8(tvb,pnstr->src_vmname_len_offset); dst_vmname_len = tvb_get_guint8(tvb,pnstr->dst_vmname_len_offset); variable_ns_len = src_vmname_len + dst_vmname_len; pnstr->eth_offset += variable_ns_len; } ti = proto_tree_add_protocol_format(tree, proto_nstrace, tvb, 0, pnstr->eth_offset, "NetScaler Packet Trace"); ns_tree = proto_item_add_subtree(ti, ett_ns); proto_tree_add_item(ns_tree, hf_ns_dir, tvb, pnstr->dir_offset, pnstr->dir_len, ENC_LITTLE_ENDIAN); proto_tree_add_item(ns_tree, hf_ns_nicno, tvb, pnstr->nicno_offset, pnstr->nicno_len, ENC_LITTLE_ENDIAN); switch (pnstr->rec_type) { case NSPR_HEADER_VERSION206: flagoffset = pnstr->ns_activity_offset; flagval32 = tvb_get_letohl(tvb, flagoffset); flagitem = proto_tree_add_uint_format(ns_tree, hf_ns_activity, tvb, flagoffset, 4, flagval32, "Activity Flags: 0x%04x", flagval32); flagtree = proto_item_add_subtree(flagitem, ett_ns_activity_flags); proto_tree_add_item(flagtree, hf_ns_activity_perf_collection, tvb, flagoffset, 4, ENC_LITTLE_ENDIAN); proto_tree_add_item(flagtree, hf_ns_activity_pcb_zombie, tvb, flagoffset, 4, ENC_LITTLE_ENDIAN); proto_tree_add_item(flagtree, hf_ns_activity_natpcb_zombie, tvb, flagoffset, 4, ENC_LITTLE_ENDIAN); proto_tree_add_item(flagtree, hf_ns_activity_lbstats_sync, tvb, flagoffset, 4, ENC_LITTLE_ENDIAN); proto_tree_add_item(flagtree, hf_ns_activity_stats_req, tvb, flagoffset, 4, ENC_LITTLE_ENDIAN); case NSPR_HEADER_VERSION205: if(src_vmname_len){ proto_tree_add_item(ns_tree,hf_ns_src_vm,tvb,pnstr->data_offset,src_vmname_len,ENC_LITTLE_ENDIAN); } if(dst_vmname_len){ proto_tree_add_item(ns_tree,hf_ns_dst_vm,tvb,pnstr->data_offset+src_vmname_len,dst_vmname_len,ENC_LITTLE_ENDIAN); } case NSPR_HEADER_VERSION204: flagoffset = pnstr->clflags_offset; flagval = tvb_get_guint8(tvb, flagoffset); for (i = 0; i < 5; i++) { bpos = 1 << i; if (flagval & bpos) { if (first_flag) { wmem_strbuf_truncate(flags_strbuf, 0); } wmem_strbuf_append_printf(flags_strbuf, "%s%s", first_flag ? "" : ", ", flags[i]); first_flag = FALSE; } } proto_tree_add_item(ns_tree, hf_ns_snode, tvb, pnstr->srcnodeid_offset, 2, ENC_LITTLE_ENDIAN); proto_tree_add_item(ns_tree, hf_ns_dnode, tvb, pnstr->destnodeid_offset, 2, ENC_LITTLE_ENDIAN); flagitem = proto_tree_add_uint_format_value(ns_tree, hf_ns_clflags, tvb, flagoffset, 1, flagval, "0x%02x (%s)", flagval, wmem_strbuf_get_str(flags_strbuf)); flagtree = proto_item_add_subtree(flagitem, ett_ns_flags); proto_tree_add_boolean(flagtree, hf_ns_clflags_res, tvb, flagoffset, 1, flagval); proto_tree_add_boolean(flagtree, hf_ns_clflags_rssh, tvb, flagoffset, 1, flagval); proto_tree_add_boolean(flagtree, hf_ns_clflags_rss, tvb, flagoffset, 1, flagval); proto_tree_add_boolean(flagtree, hf_ns_clflags_dfd, tvb, flagoffset, 1, flagval); proto_tree_add_boolean(flagtree, hf_ns_clflags_fr, tvb, flagoffset, 1, flagval); proto_tree_add_boolean(flagtree, hf_ns_clflags_fp, tvb, flagoffset, 1, flagval); case NSPR_HEADER_VERSION203: proto_tree_add_item(ns_tree, hf_ns_coreid, tvb, pnstr->coreid_offset, 2, ENC_LITTLE_ENDIAN); /* fall through to next case */ case NSPR_HEADER_VERSION202: col_add_fstr(pinfo->cinfo, COL_8021Q_VLAN_ID, "%d", tvb_get_letohs(tvb, pnstr->vlantag_offset)); proto_tree_add_item(ns_tree, hf_ns_vlantag, tvb, pnstr->vlantag_offset, 2, ENC_LITTLE_ENDIAN); /* fall through to next case */ case NSPR_HEADER_VERSION201: proto_tree_add_item(ns_tree, hf_ns_pcbdevno, tvb, pnstr->pcb_offset, 4, ENC_LITTLE_ENDIAN); ti = proto_tree_add_item(ns_tree, hf_ns_devno, tvb, pnstr->pcb_offset, 4, ENC_LITTLE_ENDIAN); PROTO_ITEM_SET_HIDDEN(ti); proto_tree_add_item(ns_tree, hf_ns_l_pcbdevno, tvb, pnstr->l_pcb_offset, 4, ENC_LITTLE_ENDIAN); ti = proto_tree_add_item(ns_tree, hf_ns_devno, tvb, pnstr->l_pcb_offset, 4, ENC_LITTLE_ENDIAN); PROTO_ITEM_SET_HIDDEN(ti); break; default: break; } /* Dissect as Ethernet */ offset = pnstr->eth_offset; next_tvb_eth_client = tvb_new_subset_remaining(tvb, offset); call_dissector(eth_withoutfcs_handle, next_tvb_eth_client, pinfo, tree); }