diff options
author | Piotr Tulpan <piotr.tulpan@netscan.pl> | 2017-06-20 19:32:36 +0200 |
---|---|---|
committer | Pascal Quantin <pascal.quantin@gmail.com> | 2017-07-04 17:06:12 +0000 |
commit | bb470c9067a1f44b2665d26d1af38efa722e30a1 (patch) | |
tree | d80b8b1c5ce87c8bf185372cb33ebedf0d38a6ab /epan/dissectors/asn1/nbap | |
parent | 367effa93ca4d5a9e3e4584be103f2a2a7dfa962 (diff) |
NBAP: improve conversation management
Keeps the address of the newly opened channels in the CTCH-SetupRqst message
to match them with the addresses sent in the Respone message to get exatch
match of the conversation.
Change-Id: I445e08480ddd178f65979b9fbc91c6031e206a61
Reviewed-on: https://code.wireshark.org/review/22271
Petri-Dish: Pascal Quantin <pascal.quantin@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Pascal Quantin <pascal.quantin@gmail.com>
Diffstat (limited to 'epan/dissectors/asn1/nbap')
-rw-r--r-- | epan/dissectors/asn1/nbap/nbap.cnf | 481 | ||||
-rw-r--r-- | epan/dissectors/asn1/nbap/packet-nbap-template.c | 666 |
2 files changed, 634 insertions, 513 deletions
diff --git a/epan/dissectors/asn1/nbap/nbap.cnf b/epan/dissectors/asn1/nbap/nbap.cnf index 20399541e4..b3114614ec 100644 --- a/epan/dissectors/asn1/nbap/nbap.cnf +++ b/epan/dissectors/asn1/nbap/nbap.cnf @@ -109,6 +109,10 @@ ProtocolIE-ContainerPairList crcn_context_present = FALSE; /*Reset CRNC Com context present flag.*/ #.END +#.FN_PARS TransactionID/shortTransActionId VAL_PTR = &TransactionID + +#.FN_PARS TransactionID/longTransActionId VAL_PTR = &TransactionID + #.FN_PARS InitiatingMessage/value FN_VARIANT=_pdu_new TYPE_REF_FN=dissect_InitiatingMessageValue #.FN_PARS SuccessfulOutcome/value FN_VARIANT=_pdu_new TYPE_REF_FN=dissect_SuccessfulOutcomeValue @@ -165,6 +169,43 @@ actx->pinfo->link_dir=P2P_DIR_UL; # CommonTransportChannelSetupRequestTDD # CommonTransportChannelSetupResponse # CommonTransportChannelSetupFailure +# CommonTransportChannel-InformationResponse +# CommonTransportChannel-InformationResponse +#.FN_BODY CommonTransportChannel-InformationResponse +address dst_addr; +nbap_setup_conv_t *request_conv; +conversation_t *conv; + +nbap_debug("Frame %%u CommonTransportChannel-InformationResponse Start", actx->pinfo->num); + +transportLayerAddress_ipv4 = 0; +BindingID_port = 0; + +%(DEFAULT_BODY)s + + if (actx->pinfo->fd->flags.visited||transportLayerAddress_ipv4==0||BindingID_port == 0){ + return offset; + } + + set_address(&dst_addr, AT_IPv4, 4, &transportLayerAddress_ipv4); + + request_conv = find_setup_conv(TransactionID, ddMode, commontransportchannelid); + + if(request_conv == NULL){ + return offset; + } + + conv = request_conv->conv; + conversation_set_addr2(conv, &dst_addr); + conversation_set_port2(conv, BindingID_port); + + delete_setup_conv(request_conv); + nbap_debug(" Frame %%u conversation setup frame: %%u %%s:%%u -> %%s:%%u", actx->pinfo->num, conv->setup_frame, + address_to_str(wmem_packet_scope(), &conv->key_ptr->addr1), conv->key_ptr->port1, + address_to_str(wmem_packet_scope(), &conv->key_ptr->addr2), conv->key_ptr->port2); + + nbap_debug("Frame %%u CommonTransportChannel-InformationResponse End", actx->pinfo->num); + # CommonTransportChannelReconfigurationRequestFDD # CommonTransportChannelReconfigurationResponse # CommonTransportChannelReconfigurationFailure @@ -746,7 +787,7 @@ hsdsch_macdflow_ids[num_items-1] = hsdsch_macdflow_id; } #.FN_BODY RACH-ParametersItem-CTCH-SetupRqstFDD -address dst_addr, null_addr; +address dst_addr, null_addr; conversation_t *conversation; fp_rach_channel_info_t* fp_rach_channel_info; umts_fp_conversation_info_t *umts_fp_conversation_info; @@ -758,68 +799,63 @@ transportFormatSet_type = NBAP_CPCH; %(DEFAULT_BODY)s - if (actx->pinfo->fd->flags.visited||transportLayerAddress_ipv4==0||BindingID_port == 0) - { - return offset; - } - clear_address(&null_addr); - - set_address(&dst_addr, AT_IPv4, 4, &transportLayerAddress_ipv4); - - conversation = find_conversation(actx->pinfo->num,&dst_addr, - &null_addr, PT_UDP, BindingID_port, - 0, NO_ADDR_B|NO_PORT_B); - - if (conversation == NULL) { - /* It's not part of any conversation - create a new one. */ - conversation = conversation_new(actx->pinfo->num, &dst_addr, - &null_addr, PT_UDP,BindingID_port , - 0, NO_ADDR2|NO_PORT2); - - /* Set dissector */ - conversation_set_dissector(conversation, fp_handle); - if(actx->pinfo->link_dir==P2P_DIR_DL){ - umts_fp_conversation_info = wmem_new0(wmem_file_scope(), umts_fp_conversation_info_t); - /* Fill in the data */ - umts_fp_conversation_info->iface_type = IuB_Interface; - umts_fp_conversation_info->division = Division_FDD; - umts_fp_conversation_info->channel = CHANNEL_RACH_FDD; - umts_fp_conversation_info->dl_frame_number = 0; - umts_fp_conversation_info->ul_frame_number = actx->pinfo->num; - copy_address_wmem(wmem_file_scope(), &(umts_fp_conversation_info->crnc_address), &dst_addr); - umts_fp_conversation_info->crnc_port = BindingID_port; - umts_fp_conversation_info->rlc_mode = FP_RLC_MODE_UNKNOWN; - - /* Adding the 'channel specific info' for RACH */ - fp_rach_channel_info = wmem_new0(wmem_file_scope(), fp_rach_channel_info_t); - fp_rach_channel_info->crnti_to_urnti_map = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope()); - umts_fp_conversation_info->channel_specific_info = (void*)fp_rach_channel_info; - + if (actx->pinfo->fd->flags.visited||transportLayerAddress_ipv4==0||BindingID_port == 0) + { + return offset; + } + clear_address(&null_addr); + + set_address(&dst_addr, AT_IPv4, 4, &transportLayerAddress_ipv4); + + conversation = conversation_new(actx->pinfo->num, &dst_addr, &null_addr, PT_UDP,BindingID_port, 0, NO_ADDR2|NO_PORT2); + + conversation_set_dissector(conversation, fp_handle); + + if(actx->pinfo->link_dir==P2P_DIR_DL){ + umts_fp_conversation_info = wmem_new0(wmem_file_scope(), umts_fp_conversation_info_t); + /* Fill in the data */ + umts_fp_conversation_info->iface_type = IuB_Interface; + umts_fp_conversation_info->division = Division_FDD; + umts_fp_conversation_info->channel = CHANNEL_RACH_FDD; + umts_fp_conversation_info->dl_frame_number = 0; + umts_fp_conversation_info->ul_frame_number = actx->pinfo->num; + copy_address_wmem(wmem_file_scope(), &(umts_fp_conversation_info->crnc_address), &dst_addr); + umts_fp_conversation_info->crnc_port = BindingID_port; + umts_fp_conversation_info->rlc_mode = FP_RLC_MODE_UNKNOWN; + + /* Adding the 'channel specific info' for RACH */ + fp_rach_channel_info = wmem_new0(wmem_file_scope(), fp_rach_channel_info_t); + fp_rach_channel_info->crnti_to_urnti_map = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope()); + umts_fp_conversation_info->channel_specific_info = (void*)fp_rach_channel_info; + + + /*Save unique UE-identifier */ + umts_fp_conversation_info->com_context_id = crcn_context_present ? com_context_id : 1; + + /* DCH's in this flow */ + umts_fp_conversation_info->dch_crc_present = g_nbap_msg_info_for_fp.dch_crc_present; + /* Set data for First or single channel */ + umts_fp_conversation_info->fp_dch_channel_info[0].num_ul_chans = num_tf = nbap_dch_chnl_info[commonphysicalchannelid].num_ul_chans; + for (j = 0; j < num_tf; j++) { + umts_fp_conversation_info->fp_dch_channel_info[0].ul_chan_tf_size[j] = nbap_dch_chnl_info[commonphysicalchannelid].ul_chan_tf_size[j]; + umts_fp_conversation_info->fp_dch_channel_info[0].ul_chan_num_tbs[j] = nbap_dch_chnl_info[commonphysicalchannelid].ul_chan_num_tbs[j]; + } - /*Save unique UE-identifier */ - umts_fp_conversation_info->com_context_id = crcn_context_present ? com_context_id : 1; + /* Traffic flows per DCH(DL) */ + umts_fp_conversation_info->fp_dch_channel_info[0].num_dl_chans = num_tf = nbap_dch_chnl_info[commonphysicalchannelid].num_dl_chans; + for (j = 0; j < num_tf; j++) { + umts_fp_conversation_info->fp_dch_channel_info[0].dl_chan_tf_size[j] = nbap_dch_chnl_info[commonphysicalchannelid].dl_chan_tf_size[j]; + umts_fp_conversation_info->fp_dch_channel_info[0].dl_chan_num_tbs[j] = nbap_dch_chnl_info[commonphysicalchannelid].dl_chan_num_tbs[j]; + } - /* DCH's in this flow */ - umts_fp_conversation_info->dch_crc_present = g_nbap_msg_info_for_fp.dch_crc_present; - /* Set data for First or single channel */ - umts_fp_conversation_info->fp_dch_channel_info[0].num_ul_chans = num_tf = nbap_dch_chnl_info[commonphysicalchannelid].num_ul_chans; - for (j = 0; j < num_tf; j++) { - umts_fp_conversation_info->fp_dch_channel_info[0].ul_chan_tf_size[j] = nbap_dch_chnl_info[commonphysicalchannelid].ul_chan_tf_size[j]; - umts_fp_conversation_info->fp_dch_channel_info[0].ul_chan_num_tbs[j] = nbap_dch_chnl_info[commonphysicalchannelid].ul_chan_num_tbs[j]; - } + umts_fp_conversation_info->dch_ids_in_flow_list[0] = commonphysicalchannelid; + umts_fp_conversation_info->num_dch_in_flow=1; + set_umts_fp_conv_data(conversation, umts_fp_conversation_info); - /* Traffic flows per DCH(DL) */ - umts_fp_conversation_info->fp_dch_channel_info[0].num_dl_chans = num_tf = nbap_dch_chnl_info[commonphysicalchannelid].num_dl_chans; - for (j = 0; j < num_tf; j++) { - umts_fp_conversation_info->fp_dch_channel_info[0].dl_chan_tf_size[j] = nbap_dch_chnl_info[commonphysicalchannelid].dl_chan_tf_size[j]; - umts_fp_conversation_info->fp_dch_channel_info[0].dl_chan_num_tbs[j] = nbap_dch_chnl_info[commonphysicalchannelid].dl_chan_num_tbs[j]; - } + /* Add Setup Conversation to list, we need it in response msg */ + add_setup_conv(TransactionID, ddMode, commontransportchannelid, actx->pinfo->num, &dst_addr, BindingID_port, umts_fp_conversation_info, conversation); + } - umts_fp_conversation_info->dch_ids_in_flow_list[0] = commonphysicalchannelid; - umts_fp_conversation_info->num_dch_in_flow=1; - set_umts_fp_conv_data(conversation, umts_fp_conversation_info); - } - } #.FN_BODY PICH-Mode VAL_PTR = &PICH_Mode guint32 PICH_Mode = 0; %(DEFAULT_BODY)s @@ -843,7 +879,7 @@ guint32 PICH_Mode = 0; #.FN_BODY PCH-ParametersItem-CTCH-SetupRqstFDD -address dst_addr, null_addr; +address dst_addr, null_addr; conversation_t *conversation; fp_pch_channel_info_t *fp_pch_channel_info; @@ -858,106 +894,95 @@ num_items = 1; %(DEFAULT_BODY)s - if (actx->pinfo->fd->flags.visited||transportLayerAddress_ipv4==0||BindingID_port == 0) - { - return offset; - } - clear_address(&null_addr); - - set_address(&dst_addr, AT_IPv4, 4, &transportLayerAddress_ipv4); - - conversation = find_conversation(actx->pinfo->num,&dst_addr, - &null_addr, PT_UDP, BindingID_port, - 0, NO_ADDR_B|NO_PORT_B); - - if (conversation == NULL) { - /* It's not part of any conversation - create a new one. */ - conversation = conversation_new(actx->pinfo->num, &dst_addr, - &null_addr, PT_UDP,BindingID_port , - 0, NO_ADDR2|NO_PORT2); - - /* Set dissector */ - conversation_set_dissector(conversation, fp_handle); - if(actx->pinfo->link_dir==P2P_DIR_DL){ - umts_fp_conversation_info = wmem_new0(wmem_file_scope(), umts_fp_conversation_info_t); - /* Fill in the data */ - umts_fp_conversation_info->iface_type = IuB_Interface; - umts_fp_conversation_info->division = Division_FDD; - umts_fp_conversation_info->channel = CHANNEL_PCH; - umts_fp_conversation_info->dl_frame_number = 0; - umts_fp_conversation_info->ul_frame_number = actx->pinfo->num; - copy_address_wmem(wmem_file_scope(), &(umts_fp_conversation_info->crnc_address), &dst_addr); - umts_fp_conversation_info->crnc_port = BindingID_port; - umts_fp_conversation_info->rlc_mode = FP_RLC_MODE_UNKNOWN; - - fp_pch_channel_info = wmem_new0(wmem_file_scope(), fp_pch_channel_info_t); - fp_pch_channel_info->paging_indications = paging_indications; - umts_fp_conversation_info->channel_specific_info = (void*)fp_pch_channel_info; - - /* DCH's in this flow */ - umts_fp_conversation_info->dch_crc_present = g_nbap_msg_info_for_fp.dch_crc_present; - /* Set data for First or single channel */ - umts_fp_conversation_info->fp_dch_channel_info[0].num_ul_chans = num_tf = nbap_dch_chnl_info[commontransportchannelid].num_ul_chans; - - nbap_debug("Frame %%u PCH-ParametersItem-CTCH-SetupRqstFDD Start: num_tf %%u", - actx->pinfo->num, - num_tf); - - for (j = 0; j < num_tf; j++) { - umts_fp_conversation_info->fp_dch_channel_info[0].ul_chan_tf_size[j] = nbap_dch_chnl_info[commontransportchannelid].ul_chan_tf_size[j]; - umts_fp_conversation_info->fp_dch_channel_info[0].ul_chan_num_tbs[j] = nbap_dch_chnl_info[commontransportchannelid].ul_chan_num_tbs[j]; - nbap_debug(" UL tf %%u ul_chan_tf_size %%u",j, nbap_dch_chnl_info[commontransportchannelid].ul_chan_tf_size[j]); - } - - /* Traffic flows per DCH(DL) */ - umts_fp_conversation_info->fp_dch_channel_info[0].num_dl_chans = num_tf = nbap_dch_chnl_info[commontransportchannelid].num_dl_chans; - for (j = 0; j < num_tf; j++) { - umts_fp_conversation_info->fp_dch_channel_info[0].dl_chan_tf_size[j] = nbap_dch_chnl_info[commontransportchannelid].dl_chan_tf_size[j]; - umts_fp_conversation_info->fp_dch_channel_info[0].dl_chan_num_tbs[j] = nbap_dch_chnl_info[commontransportchannelid].dl_chan_num_tbs[j]; - nbap_debug(" DL tf %%u ul_chan_tf_size %%u",j, nbap_dch_chnl_info[commontransportchannelid].dl_chan_tf_size[j]); - } - - /* Set data for associated DCH's if we have any */ - i = commontransportchannelid; - - nbap_debug(" commontransportchannelid %%u next ch %%u",commontransportchannelid, nbap_dch_chnl_info[i].next_dch); - - umts_fp_conversation_info->dch_ids_in_flow_list[0] = commontransportchannelid; - while(nbap_dch_chnl_info[i].next_dch != 0){ - i = nbap_dch_chnl_info[i].next_dch; - umts_fp_conversation_info->num_dch_in_flow++; - umts_fp_conversation_info->dch_ids_in_flow_list[umts_fp_conversation_info->num_dch_in_flow] = i; - /* Traffic flows per DCH(UL) */ - umts_fp_conversation_info->fp_dch_channel_info[umts_fp_conversation_info->num_dch_in_flow].num_ul_chans = num_tf = nbap_dch_chnl_info[i].num_ul_chans; - for (j = 0; j < num_tf; j++) { - umts_fp_conversation_info->fp_dch_channel_info[umts_fp_conversation_info->num_dch_in_flow].ul_chan_tf_size[j] = nbap_dch_chnl_info[i].ul_chan_tf_size[j]; - umts_fp_conversation_info->fp_dch_channel_info[umts_fp_conversation_info->num_dch_in_flow].ul_chan_num_tbs[j] = nbap_dch_chnl_info[i].ul_chan_num_tbs[j]; - } - - /* Traffic flows per DCH(DL) */ - umts_fp_conversation_info->fp_dch_channel_info[umts_fp_conversation_info->num_dch_in_flow].num_dl_chans = num_tf = nbap_dch_chnl_info[i].num_dl_chans; - for (j = 0; j < num_tf; j++) { - umts_fp_conversation_info->fp_dch_channel_info[umts_fp_conversation_info->num_dch_in_flow].dl_chan_tf_size[j] = nbap_dch_chnl_info[i].dl_chan_tf_size[j]; - umts_fp_conversation_info->fp_dch_channel_info[umts_fp_conversation_info->num_dch_in_flow].dl_chan_num_tbs[j] = nbap_dch_chnl_info[i].dl_chan_num_tbs[j]; - } - } - umts_fp_conversation_info->num_dch_in_flow++; + if (actx->pinfo->fd->flags.visited||transportLayerAddress_ipv4==0||BindingID_port == 0) + { + return offset; + } + clear_address(&null_addr); + + set_address(&dst_addr, AT_IPv4, 4, &transportLayerAddress_ipv4); + + conversation = conversation_new(actx->pinfo->num, &dst_addr, &null_addr, PT_UDP,BindingID_port, 0, NO_ADDR2|NO_PORT2); + + /* Set dissector */ + conversation_set_dissector(conversation, fp_handle); + + if(actx->pinfo->link_dir==P2P_DIR_DL){ + umts_fp_conversation_info = wmem_new0(wmem_file_scope(), umts_fp_conversation_info_t); + /* Fill in the data */ + umts_fp_conversation_info->iface_type = IuB_Interface; + umts_fp_conversation_info->division = Division_FDD; + umts_fp_conversation_info->channel = CHANNEL_PCH; + umts_fp_conversation_info->dl_frame_number = 0; + umts_fp_conversation_info->ul_frame_number = actx->pinfo->num; + copy_address_wmem(wmem_file_scope(), &(umts_fp_conversation_info->crnc_address), &dst_addr); + umts_fp_conversation_info->crnc_port = BindingID_port; + umts_fp_conversation_info->rlc_mode = FP_RLC_MODE_UNKNOWN; + + fp_pch_channel_info = wmem_new0(wmem_file_scope(), fp_pch_channel_info_t); + fp_pch_channel_info->paging_indications = paging_indications; + umts_fp_conversation_info->channel_specific_info = (void*)fp_pch_channel_info; + + /* DCH's in this flow */ + umts_fp_conversation_info->dch_crc_present = g_nbap_msg_info_for_fp.dch_crc_present; + /* Set data for First or single channel */ + umts_fp_conversation_info->fp_dch_channel_info[0].num_ul_chans = num_tf = nbap_dch_chnl_info[commontransportchannelid].num_ul_chans; + + nbap_debug("Frame %%u PCH-ParametersItem-CTCH-SetupRqstFDD Start: num_tf %%u", actx->pinfo->num, num_tf); + + for (j = 0; j < num_tf; j++) { + umts_fp_conversation_info->fp_dch_channel_info[0].ul_chan_tf_size[j] = nbap_dch_chnl_info[commontransportchannelid].ul_chan_tf_size[j]; + umts_fp_conversation_info->fp_dch_channel_info[0].ul_chan_num_tbs[j] = nbap_dch_chnl_info[commontransportchannelid].ul_chan_num_tbs[j]; + nbap_debug(" UL tf %%u ul_chan_tf_size %%u",j, nbap_dch_chnl_info[commontransportchannelid].ul_chan_tf_size[j]); + } - nbap_debug(" num_dch_in_flow %%u", umts_fp_conversation_info->num_dch_in_flow); + /* Traffic flows per DCH(DL) */ + umts_fp_conversation_info->fp_dch_channel_info[0].num_dl_chans = num_tf = nbap_dch_chnl_info[commontransportchannelid].num_dl_chans; + for (j = 0; j < num_tf; j++) { + umts_fp_conversation_info->fp_dch_channel_info[0].dl_chan_tf_size[j] = nbap_dch_chnl_info[commontransportchannelid].dl_chan_tf_size[j]; + umts_fp_conversation_info->fp_dch_channel_info[0].dl_chan_num_tbs[j] = nbap_dch_chnl_info[commontransportchannelid].dl_chan_num_tbs[j]; + nbap_debug(" DL tf %%u ul_chan_tf_size %%u",j, nbap_dch_chnl_info[commontransportchannelid].dl_chan_tf_size[j]); + } - umts_fp_conversation_info->dch_ids_in_flow_list[umts_fp_conversation_info->num_dch_in_flow] = i; - set_umts_fp_conv_data(conversation, umts_fp_conversation_info); + /* Set data for associated DCH's if we have any */ + i = commontransportchannelid; + + nbap_debug(" commontransportchannelid %%u next ch %%u",commontransportchannelid, nbap_dch_chnl_info[i].next_dch); + + umts_fp_conversation_info->dch_ids_in_flow_list[0] = commontransportchannelid; + while(nbap_dch_chnl_info[i].next_dch != 0){ + i = nbap_dch_chnl_info[i].next_dch; + umts_fp_conversation_info->num_dch_in_flow++; + umts_fp_conversation_info->dch_ids_in_flow_list[umts_fp_conversation_info->num_dch_in_flow] = i; + /* Traffic flows per DCH(UL) */ + umts_fp_conversation_info->fp_dch_channel_info[umts_fp_conversation_info->num_dch_in_flow].num_ul_chans = num_tf = nbap_dch_chnl_info[i].num_ul_chans; + for (j = 0; j < num_tf; j++) { + umts_fp_conversation_info->fp_dch_channel_info[umts_fp_conversation_info->num_dch_in_flow].ul_chan_tf_size[j] = nbap_dch_chnl_info[i].ul_chan_tf_size[j]; + umts_fp_conversation_info->fp_dch_channel_info[umts_fp_conversation_info->num_dch_in_flow].ul_chan_num_tbs[j] = nbap_dch_chnl_info[i].ul_chan_num_tbs[j]; + } + + /* Traffic flows per DCH(DL) */ + umts_fp_conversation_info->fp_dch_channel_info[umts_fp_conversation_info->num_dch_in_flow].num_dl_chans = num_tf = nbap_dch_chnl_info[i].num_dl_chans; + for (j = 0; j < num_tf; j++) { + umts_fp_conversation_info->fp_dch_channel_info[umts_fp_conversation_info->num_dch_in_flow].dl_chan_tf_size[j] = nbap_dch_chnl_info[i].dl_chan_tf_size[j]; + umts_fp_conversation_info->fp_dch_channel_info[umts_fp_conversation_info->num_dch_in_flow].dl_chan_num_tbs[j] = nbap_dch_chnl_info[i].dl_chan_num_tbs[j]; + } + } + umts_fp_conversation_info->num_dch_in_flow++; - nbap_debug("Frame %%u PCH-ParametersItem-CTCH-SetupRqstFDD End", - actx->pinfo->num); + nbap_debug(" num_dch_in_flow %%u", umts_fp_conversation_info->num_dch_in_flow); - } + umts_fp_conversation_info->dch_ids_in_flow_list[umts_fp_conversation_info->num_dch_in_flow] = i; + set_umts_fp_conv_data(conversation, umts_fp_conversation_info); - } + /* Add Setup Conversation to list, we need it in response msg */ + add_setup_conv(TransactionID, ddMode, commontransportchannelid, actx->pinfo->num, &dst_addr, BindingID_port, umts_fp_conversation_info, conversation); + nbap_debug("Frame %%u PCH-ParametersItem-CTCH-SetupRqstFDD End", actx->pinfo->num); + } #.FN_BODY FACH-ParametersItem-CTCH-SetupRqstFDD -address dst_addr, null_addr; +address dst_addr, null_addr; conversation_t *conversation; fp_fach_channel_info_t* fp_fach_channel_info; @@ -971,88 +996,82 @@ transportFormatSet_type = NBAP_CPCH; %(DEFAULT_BODY)s - if (actx->pinfo->fd->flags.visited||transportLayerAddress_ipv4==0||BindingID_port == 0) - { - return offset; - } - clear_address(&null_addr); - - set_address(&dst_addr, AT_IPv4, 4, &transportLayerAddress_ipv4); - - conversation = find_conversation(actx->pinfo->num,&dst_addr, - &null_addr, PT_UDP, BindingID_port, - 0, NO_ADDR_B|NO_PORT_B); - - if (conversation == NULL) { - /* It's not part of any conversation - create a new one. */ - conversation = conversation_new(actx->pinfo->num, &dst_addr, - &null_addr, PT_UDP,BindingID_port , - 0, NO_ADDR2|NO_PORT2); - - /* Set dissector */ - conversation_set_dissector(conversation, fp_handle); - if(actx->pinfo->link_dir==P2P_DIR_DL){ - umts_fp_conversation_info = wmem_new0(wmem_file_scope(), umts_fp_conversation_info_t); - /* Fill in the data */ - umts_fp_conversation_info->iface_type = IuB_Interface; - umts_fp_conversation_info->division = Division_FDD; - umts_fp_conversation_info->channel = CHANNEL_FACH_FDD; - umts_fp_conversation_info->dl_frame_number = 0; - umts_fp_conversation_info->ul_frame_number = actx->pinfo->num; - copy_address_wmem(wmem_file_scope(), &(umts_fp_conversation_info->crnc_address), &dst_addr); - umts_fp_conversation_info->crnc_port = BindingID_port; - umts_fp_conversation_info->rlc_mode = FP_RLC_MODE_UNKNOWN; - /*Save unique UE-identifier */ - umts_fp_conversation_info->com_context_id = crcn_context_present ? com_context_id : 1; - - /* Adding the 'channel specific info' for FACH */ - fp_fach_channel_info = wmem_new0(wmem_file_scope(), fp_fach_channel_info_t); - fp_fach_channel_info->crnti_to_urnti_map = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope()); - umts_fp_conversation_info->channel_specific_info = (void*)fp_fach_channel_info; - - /* DCH's in this flow */ - umts_fp_conversation_info->dch_crc_present = g_nbap_msg_info_for_fp.dch_crc_present; - /* Set data for First or single channel */ - umts_fp_conversation_info->fp_dch_channel_info[0].num_ul_chans = num_tf = nbap_dch_chnl_info[commonphysicalchannelid].num_ul_chans; - for (j = 0; j < num_tf; j++) { - umts_fp_conversation_info->fp_dch_channel_info[0].ul_chan_tf_size[j] = nbap_dch_chnl_info[commonphysicalchannelid].ul_chan_tf_size[j]; - umts_fp_conversation_info->fp_dch_channel_info[0].ul_chan_num_tbs[j] = nbap_dch_chnl_info[commonphysicalchannelid].ul_chan_num_tbs[j]; - } - - /* Traffic flows per DCH(DL) */ - umts_fp_conversation_info->fp_dch_channel_info[0].num_dl_chans = num_tf = nbap_dch_chnl_info[commonphysicalchannelid].num_dl_chans; - for (j = 0; j < num_tf; j++) { - umts_fp_conversation_info->fp_dch_channel_info[0].dl_chan_tf_size[j] = nbap_dch_chnl_info[commonphysicalchannelid].dl_chan_tf_size[j]; - umts_fp_conversation_info->fp_dch_channel_info[0].dl_chan_num_tbs[j] = nbap_dch_chnl_info[commonphysicalchannelid].dl_chan_num_tbs[j]; - } + if (actx->pinfo->fd->flags.visited||transportLayerAddress_ipv4==0||BindingID_port == 0) + { + return offset; + } + clear_address(&null_addr); + + set_address(&dst_addr, AT_IPv4, 4, &transportLayerAddress_ipv4); + + conversation = conversation_new(actx->pinfo->num, &dst_addr, &null_addr, PT_UDP,BindingID_port, 0, NO_ADDR2|NO_PORT2); + + /* Set dissector */ + conversation_set_dissector(conversation, fp_handle); + + if(actx->pinfo->link_dir==P2P_DIR_DL){ + umts_fp_conversation_info = wmem_new0(wmem_file_scope(), umts_fp_conversation_info_t); + /* Fill in the data */ + umts_fp_conversation_info->iface_type = IuB_Interface; + umts_fp_conversation_info->division = Division_FDD; + umts_fp_conversation_info->channel = CHANNEL_FACH_FDD; + umts_fp_conversation_info->dl_frame_number = 0; + umts_fp_conversation_info->ul_frame_number = actx->pinfo->num; + copy_address_wmem(wmem_file_scope(), &(umts_fp_conversation_info->crnc_address), &dst_addr); + umts_fp_conversation_info->crnc_port = BindingID_port; + umts_fp_conversation_info->rlc_mode = FP_RLC_MODE_UNKNOWN; + /*Save unique UE-identifier */ + umts_fp_conversation_info->com_context_id = crcn_context_present ? com_context_id : 1; + + /* Adding the 'channel specific info' for FACH */ + fp_fach_channel_info = wmem_new0(wmem_file_scope(), fp_fach_channel_info_t); + fp_fach_channel_info->crnti_to_urnti_map = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope()); + umts_fp_conversation_info->channel_specific_info = (void*)fp_fach_channel_info; + + /* DCH's in this flow */ + umts_fp_conversation_info->dch_crc_present = g_nbap_msg_info_for_fp.dch_crc_present; + /* Set data for First or single channel */ + umts_fp_conversation_info->fp_dch_channel_info[0].num_ul_chans = num_tf = nbap_dch_chnl_info[commonphysicalchannelid].num_ul_chans; + for (j = 0; j < num_tf; j++) { + umts_fp_conversation_info->fp_dch_channel_info[0].ul_chan_tf_size[j] = nbap_dch_chnl_info[commonphysicalchannelid].ul_chan_tf_size[j]; + umts_fp_conversation_info->fp_dch_channel_info[0].ul_chan_num_tbs[j] = nbap_dch_chnl_info[commonphysicalchannelid].ul_chan_num_tbs[j]; + } - /* Set data for associated DCH's if we have any */ - i = commonphysicalchannelid; - umts_fp_conversation_info->dch_ids_in_flow_list[0] = commonphysicalchannelid; - while(nbap_dch_chnl_info[i].next_dch != 0){ - i = nbap_dch_chnl_info[i].next_dch; - umts_fp_conversation_info->num_dch_in_flow++; - umts_fp_conversation_info->dch_ids_in_flow_list[umts_fp_conversation_info->num_dch_in_flow] = i; - /* Traffic flows per DCH(UL) */ - umts_fp_conversation_info->fp_dch_channel_info[umts_fp_conversation_info->num_dch_in_flow].num_ul_chans = num_tf = nbap_dch_chnl_info[i].num_ul_chans; - for (j = 0; j < num_tf; j++) { - umts_fp_conversation_info->fp_dch_channel_info[umts_fp_conversation_info->num_dch_in_flow].ul_chan_tf_size[j] = nbap_dch_chnl_info[i].ul_chan_tf_size[j]; - umts_fp_conversation_info->fp_dch_channel_info[umts_fp_conversation_info->num_dch_in_flow].ul_chan_num_tbs[j] = nbap_dch_chnl_info[i].ul_chan_num_tbs[j]; - } + /* Traffic flows per DCH(DL) */ + umts_fp_conversation_info->fp_dch_channel_info[0].num_dl_chans = num_tf = nbap_dch_chnl_info[commonphysicalchannelid].num_dl_chans; + for (j = 0; j < num_tf; j++) { + umts_fp_conversation_info->fp_dch_channel_info[0].dl_chan_tf_size[j] = nbap_dch_chnl_info[commonphysicalchannelid].dl_chan_tf_size[j]; + umts_fp_conversation_info->fp_dch_channel_info[0].dl_chan_num_tbs[j] = nbap_dch_chnl_info[commonphysicalchannelid].dl_chan_num_tbs[j]; + } - /* Traffic flows per DCH(DL) */ - umts_fp_conversation_info->fp_dch_channel_info[umts_fp_conversation_info->num_dch_in_flow].num_dl_chans = num_tf = nbap_dch_chnl_info[i].num_dl_chans; - for (j = 0; j < num_tf; j++) { - umts_fp_conversation_info->fp_dch_channel_info[umts_fp_conversation_info->num_dch_in_flow].dl_chan_tf_size[j] = nbap_dch_chnl_info[i].dl_chan_tf_size[j]; - umts_fp_conversation_info->fp_dch_channel_info[umts_fp_conversation_info->num_dch_in_flow].dl_chan_num_tbs[j] = nbap_dch_chnl_info[i].dl_chan_num_tbs[j]; - } - } - umts_fp_conversation_info->num_dch_in_flow++; - umts_fp_conversation_info->dch_ids_in_flow_list[umts_fp_conversation_info->num_dch_in_flow] = i; - set_umts_fp_conv_data(conversation, umts_fp_conversation_info); - } + /* Set data for associated DCH's if we have any */ + i = commonphysicalchannelid; + umts_fp_conversation_info->dch_ids_in_flow_list[0] = commonphysicalchannelid; + while(nbap_dch_chnl_info[i].next_dch != 0){ + i = nbap_dch_chnl_info[i].next_dch; + umts_fp_conversation_info->num_dch_in_flow++; + umts_fp_conversation_info->dch_ids_in_flow_list[umts_fp_conversation_info->num_dch_in_flow] = i; + /* Traffic flows per DCH(UL) */ + umts_fp_conversation_info->fp_dch_channel_info[umts_fp_conversation_info->num_dch_in_flow].num_ul_chans = num_tf = nbap_dch_chnl_info[i].num_ul_chans; + for (j = 0; j < num_tf; j++) { + umts_fp_conversation_info->fp_dch_channel_info[umts_fp_conversation_info->num_dch_in_flow].ul_chan_tf_size[j] = nbap_dch_chnl_info[i].ul_chan_tf_size[j]; + umts_fp_conversation_info->fp_dch_channel_info[umts_fp_conversation_info->num_dch_in_flow].ul_chan_num_tbs[j] = nbap_dch_chnl_info[i].ul_chan_num_tbs[j]; + } + + /* Traffic flows per DCH(DL) */ + umts_fp_conversation_info->fp_dch_channel_info[umts_fp_conversation_info->num_dch_in_flow].num_dl_chans = num_tf = nbap_dch_chnl_info[i].num_dl_chans; + for (j = 0; j < num_tf; j++) { + umts_fp_conversation_info->fp_dch_channel_info[umts_fp_conversation_info->num_dch_in_flow].dl_chan_tf_size[j] = nbap_dch_chnl_info[i].dl_chan_tf_size[j]; + umts_fp_conversation_info->fp_dch_channel_info[umts_fp_conversation_info->num_dch_in_flow].dl_chan_num_tbs[j] = nbap_dch_chnl_info[i].dl_chan_num_tbs[j]; + } + } + umts_fp_conversation_info->num_dch_in_flow++; + umts_fp_conversation_info->dch_ids_in_flow_list[umts_fp_conversation_info->num_dch_in_flow] = i; + set_umts_fp_conv_data(conversation, umts_fp_conversation_info); - } + /* Add Setup Conversation to list, we need it in response msg */ + add_setup_conv(TransactionID, ddMode, commontransportchannelid, actx->pinfo->num, &dst_addr, BindingID_port, umts_fp_conversation_info, conversation); + } #.FN_HDR DCH-Specific-FDD-InformationList g_num_dch_in_flow = 0; diff --git a/epan/dissectors/asn1/nbap/packet-nbap-template.c b/epan/dissectors/asn1/nbap/packet-nbap-template.c index 7034da1ef7..5dda5b712b 100644 --- a/epan/dissectors/asn1/nbap/packet-nbap-template.c +++ b/epan/dissectors/asn1/nbap/packet-nbap-template.c @@ -54,7 +54,9 @@ #define NBAP_IGNORE_PORT 255 /* Debug */ -#if 0 +#define DEBUG_NBAP 0 +#if DEBUG_NBAP +#include <epan/to_str.h> #define nbap_debug(...) g_warning(__VA_ARGS__) #else #define nbap_debug(...) @@ -102,28 +104,51 @@ extern int proto_fp; static dissector_handle_t nbap_handle; /* + * Structure to hold Setup Request/Response message conversation + * we add all src add/port declared in SetupRequest msg + * to match it with dst add/port declared in SetupResponse msg + * so we gonna have conversation with exact match (src and dst addr and port) + */ +typedef struct nbap_setup_conv +{ + guint32 transaction_id; + guint32 dd_mode; + guint32 channel_id; + guint32 request_frame_number; + address addr; + guint32 port; + umts_fp_conversation_info_t *umts_fp_conversation_info; + conversation_t *conv; +}nbap_setup_conv_t; + +/* + * Hash table to manage Setup Request/Response message conversation + * we can look in table for proper conversation + */ +static wmem_map_t *nbap_setup_conv_table; + +/* * Structure to build information needed to dissect the FP flow beeing set up. */ struct _nbap_msg_info_for_fp { - guint32 ProcedureCode; - guint32 ddMode; - gboolean is_uplink; - gint channel; /* see definitions in packet-umts_fp.h Channel types */ - guint8 dch_crc_present; /* 0=No, 1=Yes, 2=Unknown */ + guint32 ProcedureCode; + guint32 ddMode; + gboolean is_uplink; + gint channel; /* see definitions in packet-umts_fp.h Channel types */ + guint8 dch_crc_present; /* 0=No, 1=Yes, 2=Unknown */ }; typedef struct { - gint num_dch_in_flow; - gint next_dch; - gint num_ul_chans; - gint ul_chan_tf_size[MAX_FP_CHANS]; - gint ul_chan_num_tbs[MAX_FP_CHANS]; - gint num_dl_chans; - gint dl_chan_tf_size[MAX_FP_CHANS]; - gint dl_chan_num_tbs[MAX_FP_CHANS]; - + gint num_dch_in_flow; + gint next_dch; + gint num_ul_chans; + gint ul_chan_tf_size[MAX_FP_CHANS]; + gint ul_chan_num_tbs[MAX_FP_CHANS]; + gint num_dl_chans; + gint dl_chan_tf_size[MAX_FP_CHANS]; + gint dl_chan_num_tbs[MAX_FP_CHANS]; }nbap_dch_channel_info_t; nbap_dch_channel_info_t nbap_dch_chnl_info[256]; @@ -135,50 +160,45 @@ nbap_dch_channel_info_t nbap_dch_chnl_info[256]; */ typedef struct { - address crnc_address; - guint16 crnc_port; - gint no_ddi_entries; - guint8 edch_ddi[MAX_EDCH_DDIS]; - guint edch_macd_pdu_size[MAX_EDCH_DDIS]; - guint8 edch_type; /* 1 means T2 */ - guint8 lchId[MAX_EDCH_DDIS]; /*Logical channel ids.*/ - + address crnc_address; + guint16 crnc_port; + gint no_ddi_entries; + guint8 edch_ddi[MAX_EDCH_DDIS]; + guint edch_macd_pdu_size[MAX_EDCH_DDIS]; + guint8 edch_type; /* 1 means T2 */ + guint8 lchId[MAX_EDCH_DDIS]; /*Logical channel ids.*/ } nbap_edch_channel_info_t; nbap_edch_channel_info_t nbap_edch_channel_info[maxNrOfEDCHMACdFlows]; - typedef struct { - guint32 crnc_address; - guint16 crnc_port[maxNrOfEDCHMACdFlows]; - + guint32 crnc_address; + guint16 crnc_port[maxNrOfEDCHMACdFlows]; } nbap_edch_port_info_t; - typedef struct { - address crnc_address; - guint16 crnc_port; - enum fp_rlc_mode rlc_mode; - guint32 hsdsch_physical_layer_category; - guint8 entity; /* "ns" means type 1 and "ehs" means type 2, type 3 == ?*/ + address crnc_address; + guint16 crnc_port; + enum fp_rlc_mode rlc_mode; + guint32 hsdsch_physical_layer_category; + guint8 entity; /* "ns" means type 1 and "ehs" means type 2, type 3 == ?*/ } nbap_hsdsch_channel_info_t; nbap_hsdsch_channel_info_t nbap_hsdsch_channel_info[maxNrOfMACdFlows]; typedef struct { - address crnc_address; - guint16 crnc_port; - enum fp_rlc_mode rlc_mode; - + address crnc_address; + guint16 crnc_port; + enum fp_rlc_mode rlc_mode; } nbap_common_channel_info_t; -nbap_common_channel_info_t nbap_common_channel_info[maxNrOfMACdFlows]; /*TODO: Fix this!*/ +nbap_common_channel_info_t nbap_common_channel_info[maxNrOfMACdFlows]; /*TODO: Fix this!*/ gint g_num_dch_in_flow; -/* maxNrOfTFs INTEGER ::= 32 */ +/* maxNrOfTFs INTEGER ::= 32 */ gint g_dch_ids_in_flow_list[maxNrOfTFs]; gint hsdsch_macdflow_ids[maxNrOfMACdFlows]; @@ -191,9 +211,9 @@ static wmem_tree_t* edch_flow_port_map = NULL; /*Stuff for mapping NodeB-Comuncation Context ID to CRNC Communication Context ID*/ typedef struct com_ctxt_{ - /*guint nodeb_context;*/ - guint crnc_context; - guint frame_num; + /*guint nodeb_context;*/ + guint crnc_context; + guint frame_num; }nbap_com_context_id_t; gboolean crcn_context_present = FALSE; @@ -206,8 +226,9 @@ static guint32 ProcedureCode; static guint32 ProtocolIE_ID; static guint32 ddMode; static const gchar *ProcedureID; +static guint32 TransactionID; static guint32 t_dch_id, dch_id, prev_dch_id, commonphysicalchannelid, e_dch_macdflow_id, hsdsch_macdflow_id=3, - e_dch_ddi_value,logical_channel_id,common_macdflow_id; + e_dch_ddi_value,logical_channel_id,common_macdflow_id; static guint32 MACdPDU_Size, commontransportchannelid; static guint num_items; static gint paging_indications; @@ -215,11 +236,11 @@ static guint32 ib_type, segment_type; enum TransportFormatSet_type_enum { - NBAP_DCH_UL, - NBAP_DCH_DL, - NBAP_CPCH, - NBAP_FACH, - NBAP_PCH + NBAP_DCH_UL, + NBAP_DCH_DL, + NBAP_CPCH, + NBAP_FACH, + NBAP_PCH }; enum TransportFormatSet_type_enum transportFormatSet_type; @@ -227,96 +248,98 @@ enum TransportFormatSet_type_enum transportFormatSet_type; /* This table is used externally from FP, MAC and such, TODO: merge this with * lch_contents[] */ guint8 lchId_type_table[]= { - MAC_CONTENT_UNKNOWN, /* Shouldn't happen*/ - MAC_CONTENT_DCCH, /* 1 to 4 SRB => DCCH*/ - MAC_CONTENT_DCCH, - MAC_CONTENT_DCCH, - MAC_CONTENT_DCCH, - MAC_CONTENT_CS_DTCH, /* 5 to 7 Conv CS speech => ?*/ - MAC_CONTENT_CS_DTCH, - MAC_CONTENT_CS_DTCH, - MAC_CONTENT_DCCH, /* 8 SRB => DCCH*/ - MAC_CONTENT_PS_DTCH, /* 9 maps to DTCH*/ - MAC_CONTENT_UNKNOWN, /* 10 Conv CS unknown*/ - MAC_CONTENT_PS_DTCH, /* 11 Interactive PS => DTCH*/ - MAC_CONTENT_PS_DTCH, /* 12 Streaming PS => DTCH*/ - MAC_CONTENT_CS_DTCH, /* 13 Streaming CS*/ - MAC_CONTENT_PS_DTCH, /* 14 Interactive PS => DTCH*/ - MAC_CONTENT_CCCH /* This is CCCH? */ + MAC_CONTENT_UNKNOWN, /* Shouldn't happen*/ + MAC_CONTENT_DCCH, /* 1 to 4 SRB => DCCH*/ + MAC_CONTENT_DCCH, + MAC_CONTENT_DCCH, + MAC_CONTENT_DCCH, + MAC_CONTENT_CS_DTCH, /* 5 to 7 Conv CS speech => ?*/ + MAC_CONTENT_CS_DTCH, + MAC_CONTENT_CS_DTCH, + MAC_CONTENT_DCCH, /* 8 SRB => DCCH*/ + MAC_CONTENT_PS_DTCH, /* 9 maps to DTCH*/ + MAC_CONTENT_UNKNOWN, /* 10 Conv CS unknown*/ + MAC_CONTENT_PS_DTCH, /* 11 Interactive PS => DTCH*/ + MAC_CONTENT_PS_DTCH, /* 12 Streaming PS => DTCH*/ + MAC_CONTENT_CS_DTCH, /* 13 Streaming CS*/ + MAC_CONTENT_PS_DTCH, /* 14 Interactive PS => DTCH*/ + MAC_CONTENT_CCCH /* This is CCCH? */ }; /* Mapping logicalchannel id to RLC_MODE */ guint8 lchId_rlc_map[] = { - 0, - RLC_UM, /* Logical channel id = 1 is SRB1 which uses RLC_UM*/ - RLC_AM, - RLC_AM, - RLC_AM, - RLC_TM, /*5 to 7 Conv CS Speech*/ - RLC_TM, - RLC_TM, /*...*/ - RLC_AM, - RLC_AM, - RLC_AM, - RLC_AM, - RLC_AM, - RLC_AM, - RLC_AM, - RLC_AM, /* This is CCCH which is UM?, probably not */ + 0, + RLC_UM, /* Logical channel id = 1 is SRB1 which uses RLC_UM*/ + RLC_AM, + RLC_AM, + RLC_AM, + RLC_TM, /*5 to 7 Conv CS Speech*/ + RLC_TM, + RLC_TM, /*...*/ + RLC_AM, + RLC_AM, + RLC_AM, + RLC_AM, + RLC_AM, + RLC_AM, + RLC_AM, + RLC_AM, /* This is CCCH which is UM?, probably not */ }; - /* Preference variables */ /* Array with preference variables for easy looping, TODO: merge this with * lchId_type_table[] */ static int lch_contents[16] = { - MAC_CONTENT_DCCH, - MAC_CONTENT_DCCH, - MAC_CONTENT_DCCH, - MAC_CONTENT_DCCH, - MAC_CONTENT_CS_DTCH, - MAC_CONTENT_CS_DTCH, - MAC_CONTENT_CS_DTCH, - MAC_CONTENT_DCCH, - MAC_CONTENT_PS_DTCH, - MAC_CONTENT_UNKNOWN, - MAC_CONTENT_PS_DTCH, - MAC_CONTENT_PS_DTCH, - MAC_CONTENT_CS_DTCH, - MAC_CONTENT_PS_DTCH, - MAC_CONTENT_CCCH, - MAC_CONTENT_DCCH + MAC_CONTENT_DCCH, + MAC_CONTENT_DCCH, + MAC_CONTENT_DCCH, + MAC_CONTENT_DCCH, + MAC_CONTENT_CS_DTCH, + MAC_CONTENT_CS_DTCH, + MAC_CONTENT_CS_DTCH, + MAC_CONTENT_DCCH, + MAC_CONTENT_PS_DTCH, + MAC_CONTENT_UNKNOWN, + MAC_CONTENT_PS_DTCH, + MAC_CONTENT_PS_DTCH, + MAC_CONTENT_CS_DTCH, + MAC_CONTENT_PS_DTCH, + MAC_CONTENT_CCCH, + MAC_CONTENT_DCCH }; + static const enum_val_t content_types[] = { - {"MAC_CONTENT_UNKNOWN", "MAC_CONTENT_UNKNOWN", MAC_CONTENT_UNKNOWN}, - {"MAC_CONTENT_DCCH", "MAC_CONTENT_DCCH", MAC_CONTENT_DCCH}, - {"MAC_CONTENT_PS_DTCH", "MAC_CONTENT_PS_DTCH", MAC_CONTENT_PS_DTCH}, - {"MAC_CONTENT_CS_DTCH", "MAC_CONTENT_CS_DTCH", MAC_CONTENT_CS_DTCH}, - {"MAC_CONTENT_CCCH", "MAC_CONTENT_CCCH", MAC_CONTENT_CCCH}, - {NULL, NULL, -1}}; + {"MAC_CONTENT_UNKNOWN", "MAC_CONTENT_UNKNOWN", MAC_CONTENT_UNKNOWN}, + {"MAC_CONTENT_DCCH", "MAC_CONTENT_DCCH", MAC_CONTENT_DCCH}, + {"MAC_CONTENT_PS_DTCH", "MAC_CONTENT_PS_DTCH", MAC_CONTENT_PS_DTCH}, + {"MAC_CONTENT_CS_DTCH", "MAC_CONTENT_CS_DTCH", MAC_CONTENT_CS_DTCH}, + {"MAC_CONTENT_CCCH", "MAC_CONTENT_CCCH", MAC_CONTENT_CCCH}, + {NULL, NULL, -1}}; + typedef struct { - const char *name; - const char *title; - const char *description; + const char *name; + const char *title; + const char *description; } preference_strings; + /* This is used when registering preferences, name, title, description */ static const preference_strings ch_strings[] = { - {"lch1_content", "Logical Channel 1 Content", "foo"}, - {"lch2_content", "Logical Channel 2 Content", "foo"}, - {"lch3_content", "Logical Channel 3 Content", "foo"}, - {"lch4_content", "Logical Channel 4 Content", "foo"}, - {"lch5_content", "Logical Channel 5 Content", "foo"}, - {"lch6_content", "Logical Channel 6 Content", "foo"}, - {"lch7_content", "Logical Channel 7 Content", "foo"}, - {"lch8_content", "Logical Channel 8 Content", "foo"}, - {"lch9_content", "Logical Channel 9 Content", "foo"}, - {"lch10_content", "Logical Channel 10 Content", "foo"}, - {"lch11_content", "Logical Channel 11 Content", "foo"}, - {"lch12_content", "Logical Channel 12 Content", "foo"}, - {"lch13_content", "Logical Channel 13 Content", "foo"}, - {"lch14_content", "Logical Channel 14 Content", "foo"}, - {"lch15_content", "Logical Channel 15 Content", "foo"}, - {"lch16_content", "Logical Channel 16 Content", "foo"}}; + {"lch1_content", "Logical Channel 1 Content", "foo"}, + {"lch2_content", "Logical Channel 2 Content", "foo"}, + {"lch3_content", "Logical Channel 3 Content", "foo"}, + {"lch4_content", "Logical Channel 4 Content", "foo"}, + {"lch5_content", "Logical Channel 5 Content", "foo"}, + {"lch6_content", "Logical Channel 6 Content", "foo"}, + {"lch7_content", "Logical Channel 7 Content", "foo"}, + {"lch8_content", "Logical Channel 8 Content", "foo"}, + {"lch9_content", "Logical Channel 9 Content", "foo"}, + {"lch10_content", "Logical Channel 10 Content", "foo"}, + {"lch11_content", "Logical Channel 11 Content", "foo"}, + {"lch12_content", "Logical Channel 12 Content", "foo"}, + {"lch13_content", "Logical Channel 13 Content", "foo"}, + {"lch14_content", "Logical Channel 14 Content", "foo"}, + {"lch15_content", "Logical Channel 15 Content", "foo"}, + {"lch16_content", "Logical Channel 16 Content", "foo"}}; /* Dissector tables */ static dissector_table_t nbap_ies_dissector_table; @@ -331,6 +354,12 @@ static int dissect_InitiatingMessageValue(tvbuff_t *tvb, packet_info *pinfo, pro static int dissect_SuccessfulOutcomeValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *); static int dissect_UnsuccessfulOutcomeValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *); +static guint32 calculate_setup_conv_key(const guint32 transaction_id, const guint32 dd_mode, const guint32 channel_id); +static void add_setup_conv(const guint32 transaction_id, const guint32 dd_mode, const guint32 channel_id, const guint32 req_frame_number, + const address *addr, const guint32 port, umts_fp_conversation_info_t * umts_fp_conversation_info, conversation_t *conv); +static nbap_setup_conv_t* find_setup_conv(const guint32 transaction_id, const guint32 dd_mode, const guint32 channel_id); +static void delete_setup_conv(nbap_setup_conv_t *conv); + /*Easy way to add hsdhsch binds for corner cases*/ static void add_hsdsch_bind(packet_info * pinfo); @@ -364,177 +393,251 @@ static int dissect_UnsuccessfulOutcomeValue(tvbuff_t *tvb, packet_info *pinfo, p return (dissector_try_string(nbap_proc_uout_dissector_table, ProcedureID, tvb, pinfo, tree, NULL)) ? tvb_captured_length(tvb) : 0; } static void add_hsdsch_bind(packet_info *pinfo){ - address null_addr; - conversation_t *conversation = NULL; - umts_fp_conversation_info_t *umts_fp_conversation_info; - fp_hsdsch_channel_info_t* fp_hsdsch_channel_info = NULL; - guint32 i; - - if (pinfo->fd->flags.visited){ - return; - } - - /* Set port to zero use that as an indication of whether we have data or not */ - clear_address(&null_addr); - for (i = 0; i < maxNrOfMACdFlows; i++) { - if (nbap_hsdsch_channel_info[i].crnc_port != 0){ - conversation = find_conversation(pinfo->num, &(nbap_hsdsch_channel_info[i].crnc_address), &null_addr, - PT_UDP, - nbap_hsdsch_channel_info[i].crnc_port, 0, NO_ADDR_B); - - - if (conversation == NULL) { - /* It's not part of any conversation - create a new one. */ - conversation = conversation_new(pinfo->num, &(nbap_hsdsch_channel_info[i].crnc_address), - &null_addr, PT_UDP, nbap_hsdsch_channel_info[i].crnc_port, - 0, NO_ADDR2|NO_PORT2); - - /* Set dissector */ - conversation_set_dissector(conversation, fp_handle); - - if(pinfo->link_dir==P2P_DIR_DL){ - umts_fp_conversation_info = wmem_new0(wmem_file_scope(), umts_fp_conversation_info_t); - /* Fill in the HSDSCH relevant data */ - - umts_fp_conversation_info->iface_type = IuB_Interface; - umts_fp_conversation_info->division = Division_FDD; - umts_fp_conversation_info->channel = CHANNEL_HSDSCH; - umts_fp_conversation_info->dl_frame_number = 0; - umts_fp_conversation_info->ul_frame_number = pinfo->num; - copy_address_wmem(wmem_file_scope(), &(umts_fp_conversation_info->crnc_address), &nbap_hsdsch_channel_info[i].crnc_address); - umts_fp_conversation_info->crnc_port = nbap_hsdsch_channel_info[i].crnc_port; - - fp_hsdsch_channel_info = wmem_new0(wmem_file_scope(), fp_hsdsch_channel_info_t); - umts_fp_conversation_info->channel_specific_info = (void*)fp_hsdsch_channel_info; - /*Added june 3, normally just the iterator variable*/ - fp_hsdsch_channel_info->hsdsch_macdflow_id = i ; /*hsdsch_macdflow_ids[i];*/ /* hsdsch_macdflow_id;*/ - - /* Cheat and use the DCH entries */ - umts_fp_conversation_info->num_dch_in_flow++; - umts_fp_conversation_info->dch_ids_in_flow_list[umts_fp_conversation_info->num_dch_in_flow -1] = i; - - /*XXX: Is this craziness, what is physical_layer? */ - if(nbap_hsdsch_channel_info[i].entity == entity_not_specified ){ - /*Error*/ - expert_add_info(pinfo, NULL, &ei_nbap_hsdsch_entity_not_specified); - }else{ - fp_hsdsch_channel_info->hsdsch_entity = (enum fp_hsdsch_entity)nbap_hsdsch_channel_info[i].entity; - } - umts_fp_conversation_info->rlc_mode = nbap_hsdsch_channel_info[i].rlc_mode; - set_umts_fp_conv_data(conversation, umts_fp_conversation_info); - } - } - } - } + address null_addr; + conversation_t *conversation = NULL; + umts_fp_conversation_info_t *umts_fp_conversation_info; + fp_hsdsch_channel_info_t* fp_hsdsch_channel_info = NULL; + guint32 i; + + if (pinfo->fd->flags.visited){ + return; + } + + /* Set port to zero use that as an indication of whether we have data or not */ + clear_address(&null_addr); + for (i = 0; i < maxNrOfMACdFlows; i++) { + if (nbap_hsdsch_channel_info[i].crnc_port != 0){ + conversation = find_conversation(pinfo->num, &(nbap_hsdsch_channel_info[i].crnc_address), &null_addr, PT_UDP, + nbap_hsdsch_channel_info[i].crnc_port, 0, NO_ADDR_B); + + if (conversation == NULL) { + /* It's not part of any conversation - create a new one. */ + conversation = conversation_new(pinfo->num, &(nbap_hsdsch_channel_info[i].crnc_address), &null_addr, PT_UDP, + nbap_hsdsch_channel_info[i].crnc_port, 0, NO_ADDR2|NO_PORT2); + + /* Set dissector */ + conversation_set_dissector(conversation, fp_handle); + + if(pinfo->link_dir==P2P_DIR_DL){ + umts_fp_conversation_info = wmem_new0(wmem_file_scope(), umts_fp_conversation_info_t); + /* Fill in the HSDSCH relevant data */ + umts_fp_conversation_info->iface_type = IuB_Interface; + umts_fp_conversation_info->division = Division_FDD; + umts_fp_conversation_info->channel = CHANNEL_HSDSCH; + umts_fp_conversation_info->dl_frame_number = 0; + umts_fp_conversation_info->ul_frame_number = pinfo->num; + copy_address_wmem(wmem_file_scope(), &(umts_fp_conversation_info->crnc_address), &nbap_hsdsch_channel_info[i].crnc_address); + umts_fp_conversation_info->crnc_port = nbap_hsdsch_channel_info[i].crnc_port; + + fp_hsdsch_channel_info = wmem_new0(wmem_file_scope(), fp_hsdsch_channel_info_t); + umts_fp_conversation_info->channel_specific_info = (void*)fp_hsdsch_channel_info; + /*Added june 3, normally just the iterator variable*/ + fp_hsdsch_channel_info->hsdsch_macdflow_id = i ; /*hsdsch_macdflow_ids[i];*/ /* hsdsch_macdflow_id;*/ + + /* Cheat and use the DCH entries */ + umts_fp_conversation_info->num_dch_in_flow++; + umts_fp_conversation_info->dch_ids_in_flow_list[umts_fp_conversation_info->num_dch_in_flow -1] = i; + + /*XXX: Is this craziness, what is physical_layer? */ + if(nbap_hsdsch_channel_info[i].entity == entity_not_specified ){ + /*Error*/ + expert_add_info(pinfo, NULL, &ei_nbap_hsdsch_entity_not_specified); + }else{ + fp_hsdsch_channel_info->hsdsch_entity = (enum fp_hsdsch_entity)nbap_hsdsch_channel_info[i].entity; + } + umts_fp_conversation_info->rlc_mode = nbap_hsdsch_channel_info[i].rlc_mode; + set_umts_fp_conv_data(conversation, umts_fp_conversation_info); + } + } + } + } +} + +/* + * Function used to manage conversation declared in Setup Request/Response message + */ +static guint32 calculate_setup_conv_key(const guint32 transaction_id, const guint32 dd_mode, const guint32 channel_id) +{ + /* We need to pack 3 values on 32 bits: + * 31-16 transaction_id + * 15-14 dd_mode + * 13-0 channel_id + */ + guint32 key; + key = transaction_id << 16; + key |= (dd_mode & 0x03) << 14; + key |= (channel_id & 0x3fff); + nbap_debug("\tCalculating key 0x%04x", key); + return key; +} + +static void add_setup_conv(const guint32 transaction_id, const guint32 dd_mode, const guint32 channel_id, const guint32 req_frame_number, + const address *addr, const guint32 port, umts_fp_conversation_info_t * umts_fp_conversation_info, conversation_t *conv) +{ + nbap_setup_conv_t *new_conv = NULL; + guint32 key; + nbap_debug("Creating new setup conv\t TransactionID: %u\tddMode: %u\tChannelID: %u\t %s:%u", + transaction_id, dd_mode, channel_id, address_to_str(wmem_packet_scope(), addr), port); + + new_conv = wmem_new0(wmem_file_scope(), nbap_setup_conv_t); + + /* fill with data */ + new_conv->transaction_id = transaction_id; + new_conv->dd_mode = dd_mode; + new_conv->channel_id = channel_id; + new_conv->request_frame_number = req_frame_number; + copy_address_wmem(wmem_file_scope(), &new_conv->addr, addr); + new_conv->port = port; + new_conv->umts_fp_conversation_info = umts_fp_conversation_info; + new_conv->conv = conv; + + key = calculate_setup_conv_key(new_conv->transaction_id, new_conv->dd_mode, new_conv->channel_id); + + wmem_map_insert(nbap_setup_conv_table, GUINT_TO_POINTER(key), new_conv); } -static void nbap_init(void){ - guint8 i; - /*Initialize*/ - com_context_map = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope()); +static nbap_setup_conv_t* find_setup_conv(const guint32 transaction_id, const guint32 dd_mode, const guint32 channel_id) +{ + nbap_setup_conv_t *conv; + guint32 key; + nbap_debug("Looking for Setup Conversation match\t TransactionID: %u\t ddMode: %u\t ChannelID: %u", transaction_id, dd_mode, channel_id); - /*Initialize structure for muxed flow indication*/ - edch_flow_port_map = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope()); + key = calculate_setup_conv_key(transaction_id, dd_mode, channel_id); - /*Initializing Scrambling Code to C-RNC Context & C-RNC Context to U-RNTI maps*/ - nbap_scrambling_code_crncc_map = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope()); - nbap_crncc_urnti_map = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope()); + conv = (nbap_setup_conv_t*) wmem_map_lookup(nbap_setup_conv_table, GUINT_TO_POINTER(key)); - for (i = 0; i < 15; i++) { - lchId_type_table[i+1] = lch_contents[i]; - } + if(conv == NULL){ + nbap_debug("\tDidnt found Setup Conversation match"); + }else{ + nbap_debug("\tFOUND Setup Conversation match\t TransactionID: %u\t ddMode: %u\t ChannelID: %u\t %s:%u", + conv->transaction_id, conv->dd_mode, conv->channel_id, address_to_str(wmem_packet_scope(), &(conv->addr)), conv->port); + } + + return conv; +} + +static void delete_setup_conv(nbap_setup_conv_t *conv) +{ + guint32 key; + + key = calculate_setup_conv_key(conv->transaction_id, conv->dd_mode, conv->channel_id); + /* check if conversation exist */ + if(conv == NULL){ + nbap_debug("Trying delete Setup Conversation that does not exist (ptr == NULL)\t"); + return; + } + wmem_map_remove(nbap_setup_conv_table, GUINT_TO_POINTER(key)); +} + +static void nbap_init(void){ + guint8 i; + /*Initialize*/ + com_context_map = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope()); + + /*Initialize structure for muxed flow indication*/ + edch_flow_port_map = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope()); + + /*Initialize Setup Conversation hash table*/ + nbap_setup_conv_table = wmem_map_new(wmem_file_scope(), g_direct_hash, g_direct_equal); + /*Initializing Scrambling Code to C-RNC Context & C-RNC Context to U-RNTI maps*/ + nbap_scrambling_code_crncc_map = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope()); + nbap_crncc_urnti_map = wmem_tree_new_autoreset(wmem_epan_scope(), wmem_file_scope()); + + for (i = 0; i < 15; i++) { + lchId_type_table[i+1] = lch_contents[i]; + } } static int dissect_nbap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { - proto_item *nbap_item = NULL; - proto_tree *nbap_tree = NULL; - int i; - /* make entry in the Protocol column on summary display */ - col_set_str(pinfo->cinfo, COL_PROTOCOL, "NBAP"); - - /* create the nbap protocol tree */ - nbap_item = proto_tree_add_item(tree, proto_nbap, tvb, 0, -1, ENC_NA); - nbap_tree = proto_item_add_subtree(nbap_item, ett_nbap); - - /*Do a little cleanup just as a precaution*/ - for (i = 0; i < maxNrOfMACdFlows; i++) { - nbap_hsdsch_channel_info[i].entity = hs; - } - ul_scrambling_code = 0; - - return dissect_NBAP_PDU_PDU(tvb, pinfo, nbap_tree, data); + proto_item *nbap_item = NULL; + proto_tree *nbap_tree = NULL; + int i; + /* make entry in the Protocol column on summary display */ + col_set_str(pinfo->cinfo, COL_PROTOCOL, "NBAP"); + + /* create the nbap protocol tree */ + nbap_item = proto_tree_add_item(tree, proto_nbap, tvb, 0, -1, ENC_NA); + nbap_tree = proto_item_add_subtree(nbap_item, ett_nbap); + + /*Do a little cleanup just as a precaution*/ + for (i = 0; i < maxNrOfMACdFlows; i++) { + nbap_hsdsch_channel_info[i].entity = hs; + } + ul_scrambling_code = 0; + + return dissect_NBAP_PDU_PDU(tvb, pinfo, nbap_tree, data); } /*--- proto_register_nbap -------------------------------------------*/ void proto_register_nbap(void) { - module_t *nbap_module; - guint8 i; - - /* List of fields */ - static hf_register_info hf[] = { - { &hf_nbap_transportLayerAddress_ipv4, - { "transportLayerAddress IPv4", "nbap.transportLayerAddress_ipv4", - FT_IPv4, BASE_NONE, NULL, 0, - NULL, HFILL }}, - { &hf_nbap_transportLayerAddress_ipv6, - { "transportLayerAddress IPv6", "nbap.transportLayerAddress_ipv6", - FT_IPv6, BASE_NONE, NULL, 0, - NULL, HFILL }}, - { &hf_nbap_transportLayerAddress_nsap, - { "transportLayerAddress NSAP", "nbap.transportLayerAddress_NSAP", - FT_BYTES, BASE_NONE, NULL, 0, - NULL, HFILL }}, - #include "packet-nbap-hfarr.c" - }; - - /* List of subtrees */ - static gint *ett[] = { - &ett_nbap, - &ett_nbap_TransportLayerAddress, - &ett_nbap_TransportLayerAddress_nsap, - &ett_nbap_ib_sg_data, - #include "packet-nbap-ettarr.c" - }; - - static ei_register_info ei[] = { - { &ei_nbap_no_set_comm_context_id, { "nbap.no_set_comm_context_id", PI_MALFORMED, PI_WARN, "Couldn't not set Communication Context-ID, fragments over reconfigured channels might fail", EXPFILL }}, - { &ei_nbap_no_find_comm_context_id, { "nbap.no_find_comm_context_id", PI_MALFORMED, PI_WARN, "Couldn't not find Communication Context-ID, unable to reconfigure this E-DCH flow.", EXPFILL }}, - { &ei_nbap_no_find_port_info, { "nbap.no_find_port_info", PI_MALFORMED, PI_WARN, "Couldn't not find port information for reconfigured E-DCH flow, unable to reconfigure", EXPFILL }}, - { &ei_nbap_hsdsch_entity_not_specified, { "nbap.hsdsch_entity_not_specified", PI_MALFORMED,PI_ERROR, "HSDSCH Entity not specified!", EXPFILL }}, - }; - - expert_module_t* expert_nbap; - - /* Register protocol */ - proto_nbap = proto_register_protocol(PNAME, PSNAME, PFNAME); - /* Register fields and subtrees */ - proto_register_field_array(proto_nbap, hf, array_length(hf)); - proto_register_subtree_array(ett, array_length(ett)); - expert_nbap = expert_register_protocol(proto_nbap); - expert_register_field_array(expert_nbap, ei, array_length(ei)); - - /* Register dissector */ - nbap_handle = register_dissector("nbap", dissect_nbap, proto_nbap); - - nbap_module = prefs_register_protocol(proto_nbap, NULL); - - /* Register preferences for mapping logical channel IDs to MAC content types. */ - for (i = 0; i < 16; i++) { - prefs_register_enum_preference(nbap_module, ch_strings[i].name, ch_strings[i].title, ch_strings[i].description, &lch_contents[i], content_types, FALSE); - } - - /* Register dissector tables */ - nbap_ies_dissector_table = register_dissector_table("nbap.ies", "NBAP-PROTOCOL-IES", proto_nbap, FT_UINT32, BASE_DEC); - nbap_extension_dissector_table = register_dissector_table("nbap.extension", "NBAP-PROTOCOL-EXTENSION", proto_nbap, FT_UINT32, BASE_DEC); - nbap_proc_imsg_dissector_table = register_dissector_table("nbap.proc.imsg", "NBAP-ELEMENTARY-PROCEDURE InitiatingMessage", proto_nbap, FT_STRING, BASE_NONE); - nbap_proc_sout_dissector_table = register_dissector_table("nbap.proc.sout", "NBAP-ELEMENTARY-PROCEDURE SuccessfulOutcome", proto_nbap, FT_STRING, BASE_NONE); - nbap_proc_uout_dissector_table = register_dissector_table("nbap.proc.uout", "NBAP-ELEMENTARY-PROCEDURE UnsuccessfulOutcome", proto_nbap, FT_STRING, BASE_NONE); - - register_init_routine(nbap_init); + module_t *nbap_module; + guint8 i; + + /* List of fields */ + static hf_register_info hf[] = { + { &hf_nbap_transportLayerAddress_ipv4, + { "transportLayerAddress IPv4", "nbap.transportLayerAddress_ipv4", + FT_IPv4, BASE_NONE, NULL, 0, + NULL, HFILL }}, + { &hf_nbap_transportLayerAddress_ipv6, + { "transportLayerAddress IPv6", "nbap.transportLayerAddress_ipv6", + FT_IPv6, BASE_NONE, NULL, 0, + NULL, HFILL }}, + { &hf_nbap_transportLayerAddress_nsap, + { "transportLayerAddress NSAP", "nbap.transportLayerAddress_NSAP", + FT_BYTES, BASE_NONE, NULL, 0, + NULL, HFILL }}, + #include "packet-nbap-hfarr.c" + }; + + /* List of subtrees */ + static gint *ett[] = { + &ett_nbap, + &ett_nbap_TransportLayerAddress, + &ett_nbap_TransportLayerAddress_nsap, + &ett_nbap_ib_sg_data, + #include "packet-nbap-ettarr.c" + }; + + static ei_register_info ei[] = { + { &ei_nbap_no_set_comm_context_id, { "nbap.no_set_comm_context_id", PI_MALFORMED, PI_WARN, "Couldn't not set Communication Context-ID, fragments over reconfigured channels might fail", EXPFILL }}, + { &ei_nbap_no_find_comm_context_id, { "nbap.no_find_comm_context_id", PI_MALFORMED, PI_WARN, "Couldn't not find Communication Context-ID, unable to reconfigure this E-DCH flow.", EXPFILL }}, + { &ei_nbap_no_find_port_info, { "nbap.no_find_port_info", PI_MALFORMED, PI_WARN, "Couldn't not find port information for reconfigured E-DCH flow, unable to reconfigure", EXPFILL }}, + { &ei_nbap_hsdsch_entity_not_specified, { "nbap.hsdsch_entity_not_specified", PI_MALFORMED,PI_ERROR, "HSDSCH Entity not specified!", EXPFILL }}, + }; + + expert_module_t* expert_nbap; + + /* Register protocol */ + proto_nbap = proto_register_protocol(PNAME, PSNAME, PFNAME); + /* Register fields and subtrees */ + proto_register_field_array(proto_nbap, hf, array_length(hf)); + proto_register_subtree_array(ett, array_length(ett)); + expert_nbap = expert_register_protocol(proto_nbap); + expert_register_field_array(expert_nbap, ei, array_length(ei)); + + /* Register dissector */ + nbap_handle = register_dissector("nbap", dissect_nbap, proto_nbap); + + nbap_module = prefs_register_protocol(proto_nbap, NULL); + + /* Register preferences for mapping logical channel IDs to MAC content types. */ + for (i = 0; i < 16; i++) { + prefs_register_enum_preference(nbap_module, ch_strings[i].name, ch_strings[i].title, ch_strings[i].description, &lch_contents[i], content_types, FALSE); + } + + /* Register dissector tables */ + nbap_ies_dissector_table = register_dissector_table("nbap.ies", "NBAP-PROTOCOL-IES", proto_nbap, FT_UINT32, BASE_DEC); + nbap_extension_dissector_table = register_dissector_table("nbap.extension", "NBAP-PROTOCOL-EXTENSION", proto_nbap, FT_UINT32, BASE_DEC); + nbap_proc_imsg_dissector_table = register_dissector_table("nbap.proc.imsg", "NBAP-ELEMENTARY-PROCEDURE InitiatingMessage", proto_nbap, FT_STRING, BASE_NONE); + nbap_proc_sout_dissector_table = register_dissector_table("nbap.proc.sout", "NBAP-ELEMENTARY-PROCEDURE SuccessfulOutcome", proto_nbap, FT_STRING, BASE_NONE); + nbap_proc_uout_dissector_table = register_dissector_table("nbap.proc.uout", "NBAP-ELEMENTARY-PROCEDURE UnsuccessfulOutcome", proto_nbap, FT_STRING, BASE_NONE); + + register_init_routine(nbap_init); } /* @@ -544,14 +647,13 @@ void proto_register_nbap(void) void proto_reg_handoff_nbap(void) { - fp_handle = find_dissector("fp"); - dissector_add_uint("sctp.ppi", NBAP_PAYLOAD_PROTOCOL_ID, nbap_handle); + fp_handle = find_dissector("fp"); + dissector_add_uint("sctp.ppi", NBAP_PAYLOAD_PROTOCOL_ID, nbap_handle); #ifdef EXTRA_PPI - dissector_add_uint("sctp.ppi", 17, nbap_handle); + dissector_add_uint("sctp.ppi", 17, nbap_handle); #endif - dissector_add_for_decode_as("sctp.port", nbap_handle); + dissector_add_for_decode_as("sctp.port", nbap_handle); #include "packet-nbap-dis-tab.c" } - |