Add an UAT table to define endpoints and channel data to be able to

presetup conversations with FP dissection data.

Change-Id: Ibced63bf944d7268751f8055095eb26477664be1
Reviewed-on: https://code.wireshark.org/review/643
Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com>
Reviewed-by: ronnie sahlberg <ronniesahlberg@gmail.com>
Reviewed-by: Michael Mann <mmann78@netscape.net>
This commit is contained in:
AndersBroman 2014-03-13 21:41:16 +01:00 committed by Michael Mann
parent 3ac19d3643
commit f1996885d2
1 changed files with 207 additions and 1 deletions

View File

@ -26,8 +26,10 @@
#include <epan/packet.h>
#include <epan/expert.h>
#include <epan/prefs.h>
#include <epan/uat.h>
#include <epan/wmem/wmem.h>
#include <epan/conversation.h>
#include <epan/addr_resolv.h>
#include <glib.h>
#include <wsutil/crc7.h> /* For FP data header and control frame CRC. */
#include <wsutil/crc16-plain.h> /* For FP Payload CRC. */
@ -53,6 +55,10 @@
void proto_register_fp(void);
void proto_reg_handoff_fp(void);
#define UMTS_FP_IPV4 1
#define UMTS_FP_IPV6 2
/* Initialize the protocol and registered fields. */
int proto_fp = -1;
@ -249,6 +255,28 @@ static gboolean preferences_payload_checksum = TRUE;
static gboolean preferences_header_checksum = TRUE;
static gboolean preferences_udp_do_heur = FALSE;
#define UMTS_FP_USE_UAT 1
#ifdef UMTS_FP_USE_UAT
/* UAT entry structure. */
typedef struct {
guint8 protocol;
gchar *srcIP;
guint16 src_port;
gchar *dstIP;
guint16 dst_port;
guint8 interface_type;
guint8 division;
guint8 rlc_mode;
guint8 channel_type;
} uat_umts_fp_ep_and_ch_record_t;
static uat_umts_fp_ep_and_ch_record_t *uat_umts_fp_ep_and_ch_records = NULL;
static uat_t *umts_fp_uat = NULL;
static guint num_umts_fp_ep_and_ch_items = 0;
#endif /* UMTS_FP_USE_UAT */
/* E-DCH (T1) channel header information */
struct edch_t1_subframe_info
{
@ -4415,6 +4443,120 @@ dissect_fp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
}
#ifdef UMTS_FP_USE_UAT
UAT_VS_DEF(uat_umts_fp_ep_and_ch_records, protocol, uat_umts_fp_ep_and_ch_record_t, guint8, UMTS_FP_IPV4, "IPv4")
UAT_CSTRING_CB_DEF(uat_umts_fp_ep_and_ch_records, srcIP, uat_umts_fp_ep_and_ch_record_t)
UAT_DEC_CB_DEF(uat_umts_fp_ep_and_ch_records, src_port, uat_umts_fp_ep_and_ch_record_t)
UAT_CSTRING_CB_DEF(uat_umts_fp_ep_and_ch_records, dstIP, uat_umts_fp_ep_and_ch_record_t)
UAT_DEC_CB_DEF(uat_umts_fp_ep_and_ch_records, dst_port, uat_umts_fp_ep_and_ch_record_t)
UAT_VS_DEF(uat_umts_fp_ep_and_ch_records, interface_type, uat_umts_fp_ep_and_ch_record_t, guint8, IuB_Interface, "IuB Interface")
UAT_VS_DEF(uat_umts_fp_ep_and_ch_records, division, uat_umts_fp_ep_and_ch_record_t, guint8, Division_FDD, "Division FDD")
UAT_VS_DEF(uat_umts_fp_ep_and_ch_records, rlc_mode, uat_umts_fp_ep_and_ch_record_t, guint8, FP_RLC_TM, "RLC mode")
UAT_VS_DEF(uat_umts_fp_ep_and_ch_records, channel_type, uat_umts_fp_ep_and_ch_record_t, guint8, CHANNEL_RACH_FDD, "RACH FDD")
static void* uat_umts_fp_record_copy_cb(void* n, const void* o, size_t siz _U_) {
uat_umts_fp_ep_and_ch_record_t* new_rec = (uat_umts_fp_ep_and_ch_record_t *)n;
const uat_umts_fp_ep_and_ch_record_t* old_rec = (const uat_umts_fp_ep_and_ch_record_t *)o;
new_rec->srcIP = (old_rec->srcIP) ? g_strdup(old_rec->srcIP) : NULL;
new_rec->dstIP = (old_rec->dstIP) ? g_strdup(old_rec->dstIP) : NULL;
return new_rec;
}
static void uat_umts_fp_record_free_cb(void*r) {
uat_umts_fp_ep_and_ch_record_t* rec = (uat_umts_fp_ep_and_ch_record_t*)r;
g_free(rec->srcIP);
g_free(rec->dstIP);
}
/*
* Set up UAT predefined conversations for specified channels
* typedef struct {
* guint8 protocol;
* gchar *srcIP;
* guint16 src_port;
* gchar *dstIP;
* guint16 dst_port;
* guint8 interface_type;
* guint8 division;
* guint8 rlc_mode;
* guint8 channel_type;
* } uat_umts_fp_ep_and_ch_record_t;
*/
static void
umts_fp_init_protocol(void)
{
guint32 hosta_addr[4];
guint32 hostb_addr[4];
/*struct e_in6_addr ip6_addr;*/
address src_addr, dst_addr;
conversation_t *conversation;
umts_fp_conversation_info_t *umts_fp_conversation_info;
guint i,j, num_tf;
for(i=0;i<num_umts_fp_ep_and_ch_items; i++){
/* check if we have a conversation allready */
/* Convert the strings to ADDR */
if(uat_umts_fp_ep_and_ch_records[i].protocol == UMTS_FP_IPV4){
if ((uat_umts_fp_ep_and_ch_records[i].srcIP) && (!str_to_ip(uat_umts_fp_ep_and_ch_records[i].srcIP, &hosta_addr))){
continue; /* parsing failed, skip this entry */
}
if ((uat_umts_fp_ep_and_ch_records[i].dstIP) && (!str_to_ip(uat_umts_fp_ep_and_ch_records[i].dstIP, &hostb_addr))){
continue; /* parsing failed, skip this entry */
}
SET_ADDRESS(&src_addr, AT_IPv4, 4, &hosta_addr);
SET_ADDRESS(&dst_addr, AT_IPv4, 4, &hostb_addr);
}else{
continue; /* Not implemented yet */
}
conversation = find_conversation(1,&src_addr, &dst_addr, PT_UDP, uat_umts_fp_ep_and_ch_records[i].src_port, 0, NO_ADDR2|NO_PORT2);
if (conversation == NULL) {
/* It's not part of any conversation - create a new one. */
conversation = conversation_new(1, &src_addr, &dst_addr, PT_UDP,uat_umts_fp_ep_and_ch_records[i].src_port, 0, NO_ADDR2|NO_PORT2);
if(conversation==NULL)
continue;
conversation_set_dissector(conversation, fp_handle);
switch (uat_umts_fp_ep_and_ch_records[i].channel_type){
case CHANNEL_RACH_FDD:
/* set up conversation info for RACH FDD channels */
umts_fp_conversation_info = se_new0(umts_fp_conversation_info_t);
/* Fill in the data */
umts_fp_conversation_info->iface_type = uat_umts_fp_ep_and_ch_records[i].interface_type;
umts_fp_conversation_info->division = uat_umts_fp_ep_and_ch_records[i].division;
umts_fp_conversation_info->channel = uat_umts_fp_ep_and_ch_records[i].channel_type;
umts_fp_conversation_info->dl_frame_number = 0;
umts_fp_conversation_info->ul_frame_number = 1;
SE_COPY_ADDRESS(&(umts_fp_conversation_info->crnc_address), &src_addr);
umts_fp_conversation_info->crnc_port = uat_umts_fp_ep_and_ch_records[i].src_port;
umts_fp_conversation_info->rlc_mode = uat_umts_fp_ep_and_ch_records[i].rlc_mode;
/*Save unique UE-identifier */
umts_fp_conversation_info->com_context_id = 1;
/* DCH's in this flow */
umts_fp_conversation_info->dch_crc_present = 2;
/* Set data for First or single channel */
umts_fp_conversation_info->fp_dch_channel_info[0].num_ul_chans = num_tf = 1;
for (j = 0; j < num_tf; j++) {
umts_fp_conversation_info->fp_dch_channel_info[0].ul_chan_tf_size[j] = 168;
umts_fp_conversation_info->fp_dch_channel_info[0].ul_chan_num_tbs[j] = 1;
}
umts_fp_conversation_info->dchs_in_flow_list[0] = 1;
umts_fp_conversation_info->num_dch_in_flow=1;
set_umts_fp_conv_data(conversation, umts_fp_conversation_info);
default:
break;
}
}
}
}
#endif /* UMTS_FP_USE_UAT */
void proto_register_fp(void)
{
@ -5390,6 +5532,45 @@ void proto_register_fp(void)
module_t *fp_module;
expert_module_t* expert_fp;
#ifdef UMTS_FP_USE_UAT
/* Define a UAT to set channel configuration data */
static const value_string umts_fp_proto_type_vals[] = {
{ UMTS_FP_IPV4, "IPv4" },
{ UMTS_FP_IPV6, "IPv6" },
{ 0x00, NULL }
};
static const value_string umts_fp_uat_channel_type_vals[] = {
{ CHANNEL_RACH_FDD, "RACH FDD" },
{ 0x00, NULL }
};
static const value_string umts_fp_uat_interface_type_vals[] = {
{ IuB_Interface, "IuB Interface" },
{ 0x00, NULL }
};
static const value_string umts_fp_uat_division_type_vals[] = {
{ Division_FDD, "Division FDD" },
{ 0x00, NULL }
};
static const value_string umts_fp_uat_rlc_mode_vals[] = {
{ FP_RLC_TM, "FP RLC TM" },
{ 0x00, NULL }
};
static uat_field_t umts_fp_uat_flds[] = {
UAT_FLD_VS(uat_umts_fp_ep_and_ch_records, protocol, "IP address type", umts_fp_proto_type_vals, "IPv4 or IPv6"),
UAT_FLD_CSTRING(uat_umts_fp_ep_and_ch_records, srcIP, "RNC IP Address", "Source Address"),
UAT_FLD_DEC(uat_umts_fp_ep_and_ch_records, src_port, "RNC port for this channel", "Source port"),
UAT_FLD_CSTRING(uat_umts_fp_ep_and_ch_records, dstIP, "NodeB IP Address", "Destination Address"),
UAT_FLD_DEC(uat_umts_fp_ep_and_ch_records, dst_port, "NodeB port for this channel", "Destination port"),
UAT_FLD_VS(uat_umts_fp_ep_and_ch_records, interface_type, "Interface type", umts_fp_uat_interface_type_vals, "Interface type used"),
UAT_FLD_VS(uat_umts_fp_ep_and_ch_records, division, "division", umts_fp_uat_division_type_vals, "Division type used"),
UAT_FLD_VS(uat_umts_fp_ep_and_ch_records, channel_type, "Channel type", umts_fp_uat_channel_type_vals, "Channel type used"),
UAT_FLD_VS(uat_umts_fp_ep_and_ch_records, rlc_mode, "RLC mode", umts_fp_uat_rlc_mode_vals, "RLC mode used"),
UAT_END_FIELDS
};
#endif /* UMTS_FP_USE_UAT */
/* Register protocol. */
proto_fp = proto_register_protocol("FP", "FP", "fp");
proto_register_field_array(proto_fp, hf, array_length(hf));
@ -5429,12 +5610,37 @@ void proto_register_fp(void)
"Enable UDP heur dissector",
"Enable UDP heur dissector",
&preferences_udp_do_heur);
#ifdef UMTS_FP_USE_UAT
umts_fp_uat = uat_new("Endpoint and Channel Configuration",
sizeof(uat_umts_fp_ep_and_ch_record_t), /* record size */
"umts_fp_ep_and_channel_cnf", /* filename */
TRUE, /* from_profile */
&uat_umts_fp_ep_and_ch_records, /* data_ptr */
&num_umts_fp_ep_and_ch_items, /* numitems_ptr */
UAT_AFFECTS_DISSECTION, /* affects dissection of packets, but not set of named fields */
NULL, /* help */
uat_umts_fp_record_copy_cb, /* copy callback */
NULL, /* update callback */
uat_umts_fp_record_free_cb, /* free callback */
NULL, /* post update callback */
umts_fp_uat_flds); /* UAT field definitions */
prefs_register_uat_preference(fp_module,
"epandchannelconfigurationtable",
"Endpoints and Radio Channels configuration",
"Preconfigured endpoint and Channels data",
umts_fp_uat);
register_init_routine(&umts_fp_init_protocol);
#endif
}
void proto_reg_handoff_fp(void)
{
rlc_bcch_handle = find_dissector("rlc.bcch");
rlc_bcch_handle = find_dissector("rlc.bcch");
mac_fdd_rach_handle = find_dissector("mac.fdd.rach");
mac_fdd_fach_handle = find_dissector("mac.fdd.fach");
mac_fdd_pch_handle = find_dissector("mac.fdd.pch");