diff options
-rw-r--r-- | epan/dissectors/packet-exported_pdu.c | 88 | ||||
-rw-r--r-- | epan/exported_pdu.c | 29 | ||||
-rw-r--r-- | epan/exported_pdu.h | 24 | ||||
-rw-r--r-- | ui/gtk/export_pdu_dlg.c | 14 |
4 files changed, 95 insertions, 60 deletions
diff --git a/epan/dissectors/packet-exported_pdu.c b/epan/dissectors/packet-exported_pdu.c index fa335ec4e4..93143b6fb2 100644 --- a/epan/dissectors/packet-exported_pdu.c +++ b/epan/dissectors/packet-exported_pdu.c @@ -41,18 +41,21 @@ static int hf_exported_pdu_tag_len = -1; static int hf_exported_pdu_prot_name = -1; static int hf_exported_pdu_ipv4_src = -1; static int hf_exported_pdu_ipv4_dst = -1; +static int hf_exported_pdu_ipv6_src = -1; +static int hf_exported_pdu_ipv6_dst = -1; static int hf_exported_pdu_src_port = -1; static int hf_exported_pdu_dst_port = -1; /* Initialize the subtree pointers */ static gint ett_exported_pdu = -1; +static gint ett_exported_pdu_tag = -1; #define EXPORTED_PDU_NEXT_PROTO_STR 0 static const value_string exported_pdu_tag_vals[] = { { EXP_PDU_TAG_END_OF_OPT, "End-of-options" }, /* 1 - 9 reserved */ - { EXP_PDU_TAG_OPTIONS_LENGTH, "Total length of the options exluding this TLV" }, + { EXP_PDU_TAG_OPTIONS_LENGTH, "Total length of the options excluding this TLV" }, { EXP_PDU_TAG_LINKTYPE, "Linktype value" }, { EXP_PDU_TAG_PROTO_NAME, "PDU content protocol name" }, /* Add protocol type related tags here */ @@ -60,7 +63,7 @@ static const value_string exported_pdu_tag_vals[] = { { EXP_PDU_TAG_IPV4_SRC, "IPv4 Source Address" }, { EXP_PDU_TAG_IPV4_DST, "IPv4 Destination Address" }, { EXP_PDU_TAG_IPV6_SRC, "IPv6 Source Address" }, - { EXP_PDU_TAG_IPV6_DST, "IPv4 Destination Address" }, + { EXP_PDU_TAG_IPV6_DST, "IPv6 Destination Address" }, { EXP_PDU_TAG_SRC_PORT, "Source Port" }, { EXP_PDU_TAG_DST_PORT, "Destination Port" }, @@ -78,14 +81,15 @@ static void dissect_exported_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { proto_item *ti; - proto_tree *exported_pdu_tree; + proto_tree *exported_pdu_tree, *tag_tree; tvbuff_t * payload_tvb = NULL; int offset = 0; guint16 tag; int tag_len; int next_proto_type = -1; char *proto_name = NULL; - const guchar *src_addr, *dst_addr; + const guchar *src_addr, *dst_addr; + dissector_handle_t proto_handle; col_set_str(pinfo->cinfo, COL_PROTOCOL, "Exported PDU"); @@ -95,9 +99,10 @@ dissect_exported_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) exported_pdu_tree = proto_item_add_subtree(ti, ett_exported_pdu); tag = tvb_get_ntohs(tvb, offset); - proto_tree_add_item(exported_pdu_tree, hf_exported_pdu_tag, tvb, offset, 2, ENC_BIG_ENDIAN); + ti = proto_tree_add_item(exported_pdu_tree, hf_exported_pdu_tag, tvb, offset, 2, ENC_BIG_ENDIAN); offset+=2; - proto_tree_add_item(exported_pdu_tree, hf_exported_pdu_tag_len, tvb, offset, 2, ENC_BIG_ENDIAN); + tag_tree = proto_item_add_subtree(ti, ett_exported_pdu_tag); + proto_tree_add_item(tag_tree, hf_exported_pdu_tag_len, tvb, offset, 2, ENC_BIG_ENDIAN); tag_len = tvb_get_ntohs(tvb, offset); offset+=2; while(tag != 0){ @@ -105,36 +110,49 @@ dissect_exported_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) case EXP_PDU_TAG_PROTO_NAME: next_proto_type = EXPORTED_PDU_NEXT_PROTO_STR; proto_name = tvb_get_ephemeral_string(tvb, offset, tag_len); - proto_tree_add_item(exported_pdu_tree, hf_exported_pdu_prot_name, tvb, offset, tag_len, ENC_BIG_ENDIAN); + proto_tree_add_item(tag_tree, hf_exported_pdu_prot_name, tvb, offset, tag_len, ENC_ASCII|ENC_NA); break; case EXP_PDU_TAG_IPV4_SRC: - proto_tree_add_item(exported_pdu_tree, hf_exported_pdu_ipv4_src, tvb, offset, 4, ENC_BIG_ENDIAN); - src_addr = tvb_get_ptr(tvb, offset, 4); - SET_ADDRESS(&pinfo->net_src, AT_IPv4, 4, src_addr); - SET_ADDRESS(&pinfo->src, AT_IPv4, 4, src_addr); + proto_tree_add_item(tag_tree, hf_exported_pdu_ipv4_src, tvb, offset, 4, ENC_BIG_ENDIAN); + src_addr = tvb_get_ptr(tvb, offset, 4); + SET_ADDRESS(&pinfo->net_src, AT_IPv4, 4, src_addr); + SET_ADDRESS(&pinfo->src, AT_IPv4, 4, src_addr); break; case EXP_PDU_TAG_IPV4_DST: - proto_tree_add_item(exported_pdu_tree, hf_exported_pdu_ipv4_dst, tvb, offset, 4, ENC_BIG_ENDIAN); - dst_addr = tvb_get_ptr(tvb, offset, 4); - SET_ADDRESS(&pinfo->net_dst, AT_IPv4, 4, dst_addr); - SET_ADDRESS(&pinfo->dst, AT_IPv4, 4, dst_addr); + proto_tree_add_item(tag_tree, hf_exported_pdu_ipv4_dst, tvb, offset, 4, ENC_BIG_ENDIAN); + dst_addr = tvb_get_ptr(tvb, offset, 4); + SET_ADDRESS(&pinfo->net_dst, AT_IPv4, 4, dst_addr); + SET_ADDRESS(&pinfo->dst, AT_IPv4, 4, dst_addr); + break; + case EXP_PDU_TAG_IPV6_SRC: + proto_tree_add_item(tag_tree, hf_exported_pdu_ipv6_src, tvb, offset, 16, ENC_NA); + src_addr = tvb_get_ptr(tvb, offset, 4); + SET_ADDRESS(&pinfo->net_src, AT_IPv6, 16, src_addr); + SET_ADDRESS(&pinfo->src, AT_IPv6, 16, src_addr); + break; + case EXP_PDU_TAG_IPV6_DST: + proto_tree_add_item(tag_tree, hf_exported_pdu_ipv6_dst, tvb, offset, 16, ENC_NA); + dst_addr = tvb_get_ptr(tvb, offset, 4); + SET_ADDRESS(&pinfo->net_dst, AT_IPv6, 16, dst_addr); + SET_ADDRESS(&pinfo->dst, AT_IPv6, 16, dst_addr); break; case EXP_PDU_TAG_SRC_PORT: - proto_tree_add_item(exported_pdu_tree, hf_exported_pdu_src_port, tvb, offset, 4, ENC_BIG_ENDIAN); - pinfo->srcport = tvb_get_ntohl(tvb,offset); - break; + proto_tree_add_item(tag_tree, hf_exported_pdu_src_port, tvb, offset, 4, ENC_BIG_ENDIAN); + pinfo->srcport = tvb_get_ntohl(tvb,offset); + break; case EXP_PDU_TAG_DST_PORT: - proto_tree_add_item(exported_pdu_tree, hf_exported_pdu_dst_port, tvb, offset, 4, ENC_BIG_ENDIAN); - pinfo->destport = tvb_get_ntohl(tvb,offset); - break; + proto_tree_add_item(tag_tree, hf_exported_pdu_dst_port, tvb, offset, 4, ENC_BIG_ENDIAN); + pinfo->destport = tvb_get_ntohl(tvb,offset); + break; default: - break; + break; }; offset = offset + tag_len; - proto_tree_add_item(exported_pdu_tree, hf_exported_pdu_tag, tvb, offset, 2, ENC_BIG_ENDIAN); + ti = proto_tree_add_item(exported_pdu_tree, hf_exported_pdu_tag, tvb, offset, 2, ENC_BIG_ENDIAN); tag = tvb_get_ntohs(tvb, offset); offset+=2; - proto_tree_add_item(exported_pdu_tree, hf_exported_pdu_tag_len, tvb, offset, 2, ENC_BIG_ENDIAN); + tag_tree = proto_item_add_subtree(ti, ett_exported_pdu_tag); + proto_tree_add_item(tag_tree, hf_exported_pdu_tag_len, tvb, offset, 2, ENC_BIG_ENDIAN); tag_len = tvb_get_ntohs(tvb, offset); offset+=2; } @@ -143,7 +161,10 @@ dissect_exported_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) switch(next_proto_type){ case EXPORTED_PDU_NEXT_PROTO_STR: - call_dissector(find_dissector(proto_name), payload_tvb, pinfo, tree); + proto_handle = find_dissector(proto_name); + if (proto_handle) { + call_dissector(find_dissector(proto_name), payload_tvb, pinfo, tree); + } break; default: break; @@ -177,15 +198,25 @@ proto_register_exported_pdu(void) NULL, HFILL } }, { &hf_exported_pdu_ipv4_src, - { "IPv4 SRC", "exported_pdu.ipv4_src", + { "IPv4 Src", "exported_pdu.ipv4_src", FT_IPv4, BASE_NONE, NULL, 0, NULL, HFILL } }, { &hf_exported_pdu_ipv4_dst, - { "IPv4 DST", "exported_pdu.ipv4_dst", + { "IPv4 Dst", "exported_pdu.ipv4_dst", FT_IPv4, BASE_NONE, NULL, 0, NULL, HFILL } }, + { &hf_exported_pdu_ipv6_src, + { "IPv6 Src", "exported_pdu.ipv6_src", + FT_IPv6, BASE_NONE, NULL, 0, + NULL, HFILL } + }, + { &hf_exported_pdu_ipv6_dst, + { "IPv6 Dst", "exported_pdu.ipv6_dst", + FT_IPv6, BASE_NONE, NULL, 0, + NULL, HFILL } + }, { &hf_exported_pdu_src_port, { "Src Port", "exported_pdu.src_port", FT_UINT16, BASE_DEC, NULL, 0, @@ -200,7 +231,8 @@ proto_register_exported_pdu(void) /* Setup protocol subtree array */ static gint *ett[] = { - &ett_exported_pdu + &ett_exported_pdu, + &ett_exported_pdu_tag }; /* Register the protocol name and description */ diff --git a/epan/exported_pdu.c b/epan/exported_pdu.c index 4559e52fd3..3523464fb3 100644 --- a/epan/exported_pdu.c +++ b/epan/exported_pdu.c @@ -31,8 +31,8 @@ #include <epan/exported_pdu.h> /** - * Allcotates and fills the exp_pdu_data_t struct according to the wanted_exp_tags - * bit_fileld, if proto_name is != NULL, wtap_encap must be -1 or viceversa + * Allocates and fills the exp_pdu_data_t struct according to the wanted_exp_tags + * bit_fileld, if proto_name is != NULL, wtap_encap must be -1 or vice-versa */ exp_pdu_data_t * load_export_pdu_tags(packet_info *pinfo, const char* proto_name, int wtap_encap _U_, guint32 tags_bit_field) @@ -45,19 +45,16 @@ load_export_pdu_tags(packet_info *pinfo, const char* proto_name, int wtap_encap exp_pdu_data = (exp_pdu_data_t *)g_malloc(sizeof(exp_pdu_data_t)); - /* If we have a protocol name, calculate the buffersize needed including padding and tag + length */ + /* If we have a protocol name, calculate the buffer size needed including padding and tag + length */ if(proto_name){ str_len = (int)strlen(proto_name); - /* Add padding if needed */ - if(str_len % 4){ - tag_str_len = str_len + (4 - str_len % 4); - } + /* Ensure that tag length is a multiple of 4 bytes */ + tag_str_len = (str_len + 3) & 0xfffffffc; /* Add Tag + length */ tag_buf_size = tag_str_len + 4; } - if((tags_bit_field & EXP_PDU_TAG_IP_SRC_BIT) == EXP_PDU_TAG_IP_SRC_BIT){ /* tag+length */ tag_buf_size+=4; @@ -71,7 +68,7 @@ load_export_pdu_tags(packet_info *pinfo, const char* proto_name, int wtap_encap if((tags_bit_field & EXP_PDU_TAG_IP_DST_BIT) == EXP_PDU_TAG_IP_DST_BIT){ /* tag+length */ tag_buf_size+=4; - if(pinfo->net_src.type == AT_IPv4){ + if(pinfo->net_dst.type == AT_IPv4){ tag_buf_size = tag_buf_size + EXP_PDU_TAG_IPV4_DST_LEN; }else{ tag_buf_size = tag_buf_size + EXP_PDU_TAG_IPV6_DST_LEN; @@ -128,7 +125,7 @@ load_export_pdu_tags(packet_info *pinfo, const char* proto_name, int wtap_encap } memcpy(exp_pdu_data->tlv_buffer+i, pinfo->net_src.data, pinfo->net_src.len); - i = i + pinfo->net_src.len; + i += (pinfo->net_src.type == AT_IPv4) ? EXP_PDU_TAG_IPV4_SRC_LEN : EXP_PDU_TAG_IPV6_SRC_LEN; } if((tags_bit_field & EXP_PDU_TAG_IP_DST_BIT) == EXP_PDU_TAG_IP_DST_BIT){ @@ -153,7 +150,7 @@ load_export_pdu_tags(packet_info *pinfo, const char* proto_name, int wtap_encap } memcpy(exp_pdu_data->tlv_buffer+i, pinfo->net_dst.data, pinfo->net_dst.len); - i = i + pinfo->net_src.len; + i += (pinfo->net_dst.type == AT_IPv4) ? EXP_PDU_TAG_IPV4_DST_LEN : EXP_PDU_TAG_IPV6_DST_LEN; } if((tags_bit_field & EXP_PDU_TAG_SRC_PORT_BIT) == EXP_PDU_TAG_SRC_PORT_BIT){ @@ -165,7 +162,10 @@ load_export_pdu_tags(packet_info *pinfo, const char* proto_name, int wtap_encap i++; exp_pdu_data->tlv_buffer[i] = EXP_PDU_TAG_SRC_PORT_LEN; /* tag length */ i++; - memcpy(exp_pdu_data->tlv_buffer+i, &pinfo->srcport, EXP_PDU_TAG_SRC_PORT_LEN); + exp_pdu_data->tlv_buffer[i] = (pinfo->srcport & 0xff000000) >> 24; + exp_pdu_data->tlv_buffer[i+1] = (pinfo->srcport & 0x00ff0000) >> 16; + exp_pdu_data->tlv_buffer[i+2] = (pinfo->srcport & 0x0000ff00) >> 8; + exp_pdu_data->tlv_buffer[i+3] = (pinfo->srcport & 0x000000ff); i = i +EXP_PDU_TAG_SRC_PORT_LEN; } @@ -178,7 +178,10 @@ load_export_pdu_tags(packet_info *pinfo, const char* proto_name, int wtap_encap i++; exp_pdu_data->tlv_buffer[i] = EXP_PDU_TAG_DST_PORT_LEN; /* tag length */ i++; - memcpy(exp_pdu_data->tlv_buffer+i, &pinfo->destport, EXP_PDU_TAG_DST_PORT_LEN); + exp_pdu_data->tlv_buffer[i] = (pinfo->destport & 0xff000000) >> 24; + exp_pdu_data->tlv_buffer[i+1] = (pinfo->destport & 0x00ff0000) >> 16; + exp_pdu_data->tlv_buffer[i+2] = (pinfo->destport & 0x0000ff00) >> 8; + exp_pdu_data->tlv_buffer[i+3] = (pinfo->destport & 0x000000ff); i = i +EXP_PDU_TAG_DST_PORT_LEN; } diff --git a/epan/exported_pdu.h b/epan/exported_pdu.h index a1c88970c1..b9d80aa1ed 100644 --- a/epan/exported_pdu.h +++ b/epan/exported_pdu.h @@ -31,7 +31,7 @@ /** * This struct is used as the data part of tap_queue_packet() and contains a * buffer with metadata of the protocol PDU included in the tvb in the struct. - * the meta data is in TLV form, at least one tag MUST indicat what protocol is + * the meta data is in TLV form, at least one tag MUST indicate what protocol is * in the PDU. * Buffer layout: * 0 1 2 3 @@ -53,7 +53,7 @@ /* Tag values */ #define EXP_PDU_TAG_END_OF_OPT 0 /**< End-of-options Tag. */ /* 1 - 9 reserved */ -#define EXP_PDU_TAG_OPTIONS_LENGTH 10 /**< Total length of the options exluding this TLV */ +#define EXP_PDU_TAG_OPTIONS_LENGTH 10 /**< Total length of the options excluding this TLV */ #define EXP_PDU_TAG_LINKTYPE 11 /**< The value part is the linktype value defined by tcpdump * http://www.tcpdump.org/linktypes.html */ @@ -65,16 +65,16 @@ /* 13 - 19 reserved */ #define EXP_PDU_TAG_IPV4_SRC 20 #define EXP_PDU_TAG_IPV4_DST 21 -#define EXP_PDU_TAG_IPV6_SRC 21 -#define EXP_PDU_TAG_IPV6_DST 22 +#define EXP_PDU_TAG_IPV6_SRC 22 +#define EXP_PDU_TAG_IPV6_DST 23 -#define EXP_PDU_TAG_SRC_PORT 23 -#define EXP_PDU_TAG_DST_PORT 24 +#define EXP_PDU_TAG_SRC_PORT 24 +#define EXP_PDU_TAG_DST_PORT 25 -#define EXP_PDU_TAG_SCTP_PPID 25 +#define EXP_PDU_TAG_SCTP_PPID 26 -#define EXP_PDU_TAG_SS7_OPC 26 -#define EXP_PDU_TAG_SS7_DPC 27 +#define EXP_PDU_TAG_SS7_OPC 27 +#define EXP_PDU_TAG_SS7_DPC 28 typedef struct _exp_pdu_data_t { @@ -109,8 +109,8 @@ typedef struct _exp_pdu_data_t { #define EXP_PDU_TAG_SS7_DPC_LEN 2 /** - * Allcotates and fills the exp_pdu_data_t struct according to the wanted_exp_tags - * bit_fileld, if proto_name is != NULL, wtap_encap must be -1 or viceversa + * Allocates and fills the exp_pdu_data_t struct according to the wanted_exp_tags + * bit_fileld, if proto_name is != NULL, wtap_encap must be -1 or vice-versa */ WS_DLL_PUBLIC exp_pdu_data_t *load_export_pdu_tags(packet_info *pinfo, - const char* proto_name, int wtap_encap, guint32 wanted_exp_tags); + const char* proto_name, int wtap_encap, guint32 wanted_exp_tags); diff --git a/ui/gtk/export_pdu_dlg.c b/ui/gtk/export_pdu_dlg.c index 35af7bfaa5..2cade36e91 100644 --- a/ui/gtk/export_pdu_dlg.c +++ b/ui/gtk/export_pdu_dlg.c @@ -78,11 +78,11 @@ export_pdu_packet(void *tapdata, packet_info *pinfo, epan_dissect_t *edt _U_, co pkthdr.pkt_encap = exp_pdu_tap_data->pkt_encap; pkthdr.interface_id = 0; pkthdr.presence_flags = 0; - if(pinfo->fd->opt_comment == NULL){ - pkthdr.opt_comment = NULL; - }else{ - pkthdr.opt_comment = g_strdup(pinfo->fd->opt_comment); - } + if(pinfo->fd->opt_comment == NULL){ + pkthdr.opt_comment = NULL; + }else{ + pkthdr.opt_comment = g_strdup(pinfo->fd->opt_comment); + } pkthdr.drop_count = 0; pkthdr.pack_flags = 0; pkthdr.presence_flags = WTAP_HAS_CAP_LEN|WTAP_HAS_INTERFACE_ID|WTAP_HAS_TS|WTAP_HAS_PACK_FLAGS; @@ -90,7 +90,7 @@ export_pdu_packet(void *tapdata, packet_info *pinfo, epan_dissect_t *edt _U_, co wtap_dump(exp_pdu_tap_data->wdh, &pkthdr, packet_buf, &err); g_free(packet_buf); - g_free(pkthdr.opt_comment); + g_free(pkthdr.opt_comment); return FALSE; /* Do not redraw */ } @@ -270,7 +270,7 @@ export_pdu_show_cb(GtkWidget *w _U_, gpointer d _U_) gtk_box_pack_start(GTK_BOX(main_vb), grid, TRUE, TRUE, 0); row = 0; - label = gtk_label_new("Add a droptown list to select USER_DLT, currently hardcoded to USER10"); + label = gtk_label_new("Add a drop-down list to select USER_DLT, currently hardcoded to USER10"); ws_gtk_grid_attach_defaults(GTK_GRID(grid), label, 0, row, 1, 1); /* Setup the button row */ |