static void dissect_tns_connect(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, proto_tree *tns_tree) { proto_tree *connect_tree = NULL, *ti; proto_item *hidden_item; int cd_offset; int cd_len; int tns_offset = offset-8; if ( tree ) { connect_tree = proto_tree_add_subtree(tns_tree, tvb, offset, -1, ett_tns_connect, NULL, "Connect"); hidden_item = proto_tree_add_boolean(tns_tree, hf_tns_connect, tvb, 0, 0, TRUE); PROTO_ITEM_SET_HIDDEN(hidden_item); } col_append_str(pinfo->cinfo, COL_INFO, ", Connect"); if ( connect_tree ) { proto_tree_add_item(connect_tree, hf_tns_version, tvb, offset, 2, ENC_BIG_ENDIAN); } offset += 2; if ( connect_tree ) { proto_tree_add_item(connect_tree, hf_tns_compat_version, tvb, offset, 2, ENC_BIG_ENDIAN); } offset += 2; if ( connect_tree ) { proto_tree *sopt_tree = NULL; ti = proto_tree_add_item(connect_tree, hf_tns_service_options, tvb, offset, 2, ENC_BIG_ENDIAN); sopt_tree = proto_item_add_subtree(ti, ett_tns_sopt_flag); dissect_tns_service_options(tvb, offset, sopt_tree); } offset += 2; if ( connect_tree ) { proto_tree_add_item(connect_tree, hf_tns_sdu_size, tvb, offset, 2, ENC_BIG_ENDIAN); } offset += 2; if ( connect_tree ) { proto_tree_add_item(connect_tree, hf_tns_max_tdu_size, tvb, offset, 2, ENC_BIG_ENDIAN); } offset += 2; if ( connect_tree ) { proto_tree *ntp_tree = NULL; ti = proto_tree_add_item(connect_tree, hf_tns_nt_proto_characteristics, tvb, offset, 2, ENC_BIG_ENDIAN); ntp_tree = proto_item_add_subtree(ti, ett_tns_ntp_flag); proto_tree_add_item(ntp_tree, hf_tns_ntp_flag_hangon, tvb, offset, 2, ENC_BIG_ENDIAN); proto_tree_add_item(ntp_tree, hf_tns_ntp_flag_crel, tvb, offset, 2, ENC_BIG_ENDIAN); proto_tree_add_item(ntp_tree, hf_tns_ntp_flag_tduio, tvb, offset, 2, ENC_BIG_ENDIAN); proto_tree_add_item(ntp_tree, hf_tns_ntp_flag_srun, tvb, offset, 2, ENC_BIG_ENDIAN); proto_tree_add_item(ntp_tree, hf_tns_ntp_flag_dtest, tvb, offset, 2, ENC_BIG_ENDIAN); proto_tree_add_item(ntp_tree, hf_tns_ntp_flag_cbio, tvb, offset, 2, ENC_BIG_ENDIAN); proto_tree_add_item(ntp_tree, hf_tns_ntp_flag_asio, tvb, offset, 2, ENC_BIG_ENDIAN); proto_tree_add_item(ntp_tree, hf_tns_ntp_flag_pio, tvb, offset, 2, ENC_BIG_ENDIAN); proto_tree_add_item(ntp_tree, hf_tns_ntp_flag_grant, tvb, offset, 2, ENC_BIG_ENDIAN); proto_tree_add_item(ntp_tree, hf_tns_ntp_flag_handoff, tvb, offset, 2, ENC_BIG_ENDIAN); proto_tree_add_item(ntp_tree, hf_tns_ntp_flag_sigio, tvb, offset, 2, ENC_BIG_ENDIAN); proto_tree_add_item(ntp_tree, hf_tns_ntp_flag_sigpipe, tvb, offset, 2, ENC_BIG_ENDIAN); proto_tree_add_item(ntp_tree, hf_tns_ntp_flag_sigurg, tvb, offset, 2, ENC_BIG_ENDIAN); proto_tree_add_item(ntp_tree, hf_tns_ntp_flag_urgentio, tvb, offset, 2, ENC_BIG_ENDIAN); proto_tree_add_item(ntp_tree, hf_tns_ntp_flag_fdio, tvb, offset, 2, ENC_BIG_ENDIAN); proto_tree_add_item(ntp_tree, hf_tns_ntp_flag_testop, tvb, offset, 2, ENC_BIG_ENDIAN); } offset += 2; if ( connect_tree ) { proto_tree_add_item(connect_tree, hf_tns_line_turnaround, tvb, offset, 2, ENC_BIG_ENDIAN); } offset += 2; if ( connect_tree ) { proto_tree_add_item(connect_tree, hf_tns_value_of_one, tvb, offset, 2, ENC_NA); } offset += 2; cd_len = tvb_get_ntohs(tvb, offset); if ( connect_tree ) { proto_tree_add_uint(connect_tree, hf_tns_connect_data_length, tvb, offset, 2, cd_len); } offset += 2; cd_offset = tvb_get_ntohs(tvb, offset); if ( connect_tree ) { proto_tree_add_uint(connect_tree, hf_tns_connect_data_offset, tvb, offset, 2, cd_offset); } offset += 2; if ( connect_tree ) { proto_tree_add_item(connect_tree, hf_tns_connect_data_max, tvb, offset, 4, ENC_BIG_ENDIAN); } offset += 4; if ( connect_tree ) { proto_tree *cflag_tree = NULL; ti = proto_tree_add_item(connect_tree, hf_tns_connect_flags0, tvb, offset, 1, ENC_BIG_ENDIAN); cflag_tree = proto_item_add_subtree(ti, ett_tns_conn_flag); dissect_tns_connect_flag(tvb, offset, cflag_tree); } offset += 1; if ( connect_tree ) { proto_tree *cflag_tree = NULL; ti = proto_tree_add_item(connect_tree, hf_tns_connect_flags1, tvb, offset, 1, ENC_BIG_ENDIAN); cflag_tree = proto_item_add_subtree(ti, ett_tns_conn_flag); dissect_tns_connect_flag(tvb, offset, cflag_tree); } offset += 1; /* * XXX - sometimes it appears that this stuff isn't present * in the packet. */ if (offset + 16 <= tns_offset+cd_offset) { if ( connect_tree ) { proto_tree_add_item(connect_tree, hf_tns_trace_cf1, tvb, offset, 4, ENC_BIG_ENDIAN); } offset += 4; if ( connect_tree ) { proto_tree_add_item(connect_tree, hf_tns_trace_cf2, tvb, offset, 4, ENC_BIG_ENDIAN); } offset += 4; if ( connect_tree ) { proto_tree_add_item(connect_tree, hf_tns_trace_cid, tvb, offset, 8, ENC_BIG_ENDIAN); } /* offset += 8;*/ } if ( connect_tree && cd_len > 0) { proto_tree_add_item(connect_tree, hf_tns_connect_data, tvb, tns_offset+cd_offset, -1, ENC_ASCII|ENC_NA); } return; }
static void dissect_tns_accept(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, proto_tree *tns_tree) { proto_tree *accept_tree = NULL, *ti; proto_item *hidden_item; int accept_offset; int accept_len; int tns_offset = offset-8; if ( tree ) { ti = proto_tree_add_text(tns_tree, tvb, offset, -1, "Accept"); accept_tree = proto_item_add_subtree(ti, ett_tns_accept); hidden_item = proto_tree_add_boolean(tns_tree, hf_tns_accept, tvb, 0, 0, TRUE); PROTO_ITEM_SET_HIDDEN(hidden_item); } col_append_str(pinfo->cinfo, COL_INFO, ", Accept"); if ( accept_tree ) { proto_tree_add_item(accept_tree, hf_tns_version, tvb, offset, 2, ENC_BIG_ENDIAN); } offset += 2; if ( accept_tree ) { proto_tree *sopt_tree = NULL; ti = proto_tree_add_item(accept_tree, hf_tns_service_options, tvb, offset, 2, ENC_BIG_ENDIAN); sopt_tree = proto_item_add_subtree(ti, ett_tns_sopt_flag); dissect_tns_service_options(tvb, offset, sopt_tree); } offset += 2; if ( accept_tree ) { proto_tree_add_item(accept_tree, hf_tns_sdu_size, tvb, offset, 2, ENC_BIG_ENDIAN); } offset += 2; if ( accept_tree ) { proto_tree_add_item(accept_tree, hf_tns_max_tdu_size, tvb, offset, 2, ENC_BIG_ENDIAN); } offset += 2; if ( accept_tree ) { proto_tree_add_item(accept_tree, hf_tns_value_of_one, tvb, offset, 2, ENC_NA); } offset += 2; accept_len = tvb_get_ntohs(tvb, offset); if ( accept_tree ) { proto_tree_add_uint(accept_tree, hf_tns_accept_data_length, tvb, offset, 2, accept_len); } offset += 2; accept_offset = tvb_get_ntohs(tvb, offset); if ( accept_tree ) { proto_tree_add_uint(accept_tree, hf_tns_accept_data_offset, tvb, offset, 2, accept_offset); } offset += 2; if ( accept_tree ) { proto_tree *cflag_tree = NULL; ti = proto_tree_add_item(accept_tree, hf_tns_connect_flags0, tvb, offset, 1, ENC_BIG_ENDIAN); cflag_tree = proto_item_add_subtree(ti, ett_tns_conn_flag); dissect_tns_connect_flag(tvb, offset, cflag_tree); } offset += 1; if ( accept_tree ) { proto_tree *cflag_tree = NULL; ti = proto_tree_add_item(accept_tree, hf_tns_connect_flags1, tvb, offset, 1, ENC_BIG_ENDIAN); cflag_tree = proto_item_add_subtree(ti, ett_tns_conn_flag); dissect_tns_connect_flag(tvb, offset, cflag_tree); } offset += 1; if ( accept_tree && accept_len > 0) { proto_tree_add_item(accept_tree, hf_tns_accept_data, tvb, tns_offset+accept_offset, -1, ENC_ASCII|ENC_NA); } return; }