diff options
-rw-r--r-- | epan/dissectors/packet-exported_pdu.c | 48 | ||||
-rw-r--r-- | epan/exported_pdu.c | 91 | ||||
-rw-r--r-- | epan/exported_pdu.h | 4 |
3 files changed, 115 insertions, 28 deletions
diff --git a/epan/dissectors/packet-exported_pdu.c b/epan/dissectors/packet-exported_pdu.c index 6c73f6fa3a..47c1f0e0e8 100644 --- a/epan/dissectors/packet-exported_pdu.c +++ b/epan/dissectors/packet-exported_pdu.c @@ -30,6 +30,9 @@ #include <epan/packet.h> #include <epan/tap.h> #include <epan/exported_pdu.h> +#include <epan/wmem/wmem.h> + +#include "packet-mtp3.h" void proto_reg_handoff_exported_pdu(void); @@ -45,6 +48,8 @@ static int hf_exported_pdu_port_type = -1; static int hf_exported_pdu_src_port = -1; static int hf_exported_pdu_dst_port = -1; static int hf_exported_pdu_sctp_ppid = -1; +static int hf_exported_pdu_ss7_opc = -1; +static int hf_exported_pdu_ss7_dpc = -1; static int hf_exported_pdu_orig_fno = -1; @@ -95,6 +100,7 @@ dissect_exported_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) char *proto_name = NULL; const guchar *src_addr, *dst_addr; dissector_handle_t proto_handle; + mtp3_addr_pc_t *mtp3_addr; col_set_str(pinfo->cinfo, COL_PROTOCOL, "Exported PDU"); @@ -131,35 +137,51 @@ dissect_exported_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) 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); + src_addr = tvb_get_ptr(tvb, offset, 16); 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); + dst_addr = tvb_get_ptr(tvb, offset, 16); SET_ADDRESS(&pinfo->net_dst, AT_IPv6, 16, dst_addr); SET_ADDRESS(&pinfo->dst, AT_IPv6, 16, dst_addr); break; case EXP_PDU_TAG_PORT_TYPE: - pinfo->ptype = (port_type)tvb_get_ntohl(tvb,offset); + pinfo->ptype = (port_type)tvb_get_ntohl(tvb, offset); proto_tree_add_uint_format_value(tag_tree, hf_exported_pdu_port_type, tvb, offset, 4, pinfo->ptype, "%s (%u)", port_type_to_str(pinfo->ptype), pinfo->ptype); break; case EXP_PDU_TAG_SRC_PORT: proto_tree_add_item(tag_tree, hf_exported_pdu_src_port, tvb, offset, 4, ENC_BIG_ENDIAN); - pinfo->srcport = tvb_get_ntohl(tvb,offset); + pinfo->srcport = tvb_get_ntohl(tvb, offset); break; case EXP_PDU_TAG_DST_PORT: proto_tree_add_item(tag_tree, hf_exported_pdu_dst_port, tvb, offset, 4, ENC_BIG_ENDIAN); - pinfo->destport = tvb_get_ntohl(tvb,offset); + pinfo->destport = tvb_get_ntohl(tvb, offset); break; case EXP_PDU_TAG_SCTP_PPID: proto_tree_add_item(tag_tree, hf_exported_pdu_sctp_ppid, tvb, offset, 4, ENC_BIG_ENDIAN); if (number_of_ppids < MAX_NUMBER_OF_PPIDS) { - pinfo->ppids[number_of_ppids++] = tvb_get_ntohl(tvb,offset); + pinfo->ppids[number_of_ppids++] = tvb_get_ntohl(tvb, offset); } break; + case EXP_PDU_TAG_SS7_OPC: + proto_tree_add_item(tag_tree, hf_exported_pdu_ss7_opc, tvb, offset, 4, ENC_BIG_ENDIAN); + mtp3_addr = (mtp3_addr_pc_t *)wmem_alloc0(pinfo->pool, sizeof(mtp3_addr_pc_t)); + mtp3_addr->pc = tvb_get_ntohl(tvb, offset); + mtp3_addr->type = (Standard_Type)tvb_get_ntohs(tvb, offset+4); + mtp3_addr->ni = tvb_get_guint8(tvb, offset+6); + SET_ADDRESS(&pinfo->src, AT_SS7PC, sizeof(mtp3_addr_pc_t), (guint8 *) mtp3_addr); + break; + case EXP_PDU_TAG_SS7_DPC: + proto_tree_add_item(tag_tree, hf_exported_pdu_ss7_dpc, tvb, offset, 4, ENC_BIG_ENDIAN); + mtp3_addr = (mtp3_addr_pc_t *)wmem_alloc0(pinfo->pool, sizeof(mtp3_addr_pc_t)); + mtp3_addr->pc = tvb_get_ntohl(tvb, offset); + mtp3_addr->type = (Standard_Type)tvb_get_ntohs(tvb, offset+4); + mtp3_addr->ni = tvb_get_guint8(tvb, offset+6); + SET_ADDRESS(&pinfo->dst, AT_SS7PC, sizeof(mtp3_addr_pc_t), (guint8 *) mtp3_addr); + break; case EXP_PDU_TAG_ORIG_FNO: proto_tree_add_item(tag_tree, hf_exported_pdu_orig_fno, tvb, offset, 4, ENC_BIG_ENDIAN); break; @@ -212,7 +234,7 @@ proto_register_exported_pdu(void) NULL, HFILL } }, { &hf_exported_pdu_prot_name, - { "Protocol name", "exported_pdu.prot_name", + { "Protocol Name", "exported_pdu.prot_name", FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL } }, @@ -252,7 +274,17 @@ proto_register_exported_pdu(void) NULL, HFILL } }, { &hf_exported_pdu_sctp_ppid, - { "Original SCTP PPID", "exported_pdu.sctp_ppid", + { "SCTP PPID", "exported_pdu.sctp_ppid", + FT_UINT32, BASE_DEC, NULL, 0, + NULL, HFILL } + }, + { &hf_exported_pdu_ss7_opc, + { "SS7 OPC", "exported_pdu.ss7_opc", + FT_UINT32, BASE_DEC, NULL, 0, + NULL, HFILL } + }, + { &hf_exported_pdu_ss7_dpc, + { "SS7 DPC", "exported_pdu.ss7_dpc", FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL } }, diff --git a/epan/exported_pdu.c b/epan/exported_pdu.c index 8908a575d4..4a549c1844 100644 --- a/epan/exported_pdu.c +++ b/epan/exported_pdu.c @@ -29,6 +29,7 @@ #include <epan/packet.h> #include <epan/exported_pdu.h> +#include <epan/dissectors/packet-mtp3.h> /** * Allocates and fills the exp_pdu_data_t struct according to the wanted_exp_tags @@ -57,22 +58,18 @@ load_export_pdu_tags(packet_info *pinfo, const char* proto_name, int wtap_encap } if((tags_bit_field & EXP_PDU_TAG_IP_SRC_BIT) == EXP_PDU_TAG_IP_SRC_BIT){ - /* tag+length */ - tag_buf_size+=4; if(pinfo->net_src.type == AT_IPv4){ - tag_buf_size = tag_buf_size + EXP_PDU_TAG_IPV4_SRC_LEN; - }else{ - tag_buf_size = tag_buf_size + EXP_PDU_TAG_IPV6_SRC_LEN; + tag_buf_size += 4 + EXP_PDU_TAG_IPV4_SRC_LEN; + }else if(pinfo->net_src.type == AT_IPv6){ + tag_buf_size += 4 + EXP_PDU_TAG_IPV6_SRC_LEN; } } 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_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; + tag_buf_size += 4 + EXP_PDU_TAG_IPV4_DST_LEN; + }else if(pinfo->net_dst.type == AT_IPv6){ + tag_buf_size += 4 + EXP_PDU_TAG_IPV6_DST_LEN; } } @@ -101,6 +98,18 @@ load_export_pdu_tags(packet_info *pinfo, const char* proto_name, int wtap_encap } } + if((tags_bit_field & EXP_PDU_TAG_SS7_OPC_BIT) == EXP_PDU_TAG_SS7_OPC_BIT){ + if(pinfo->src.type == AT_SS7PC){ + tag_buf_size += 4 + EXP_PDU_TAG_SS7_OPC_LEN; + } + } + + if((tags_bit_field & EXP_PDU_TAG_SS7_DPC_BIT) == EXP_PDU_TAG_SS7_DPC_BIT){ + if(pinfo->dst.type == AT_SS7PC){ + tag_buf_size += 4 + EXP_PDU_TAG_SS7_DPC_LEN; + } + } + if((tags_bit_field & EXP_PDU_TAG_ORIG_FNO_BIT) == EXP_PDU_TAG_ORIG_FNO_BIT){ tag_buf_size= tag_buf_size + EXP_PDU_TAG_ORIG_FNO_LEN + 4; } @@ -136,7 +145,9 @@ load_export_pdu_tags(packet_info *pinfo, const char* proto_name, int wtap_encap i++; exp_pdu_data->tlv_buffer[i] = EXP_PDU_TAG_IPV4_SRC_LEN; /* tag length */ i++; - }else{ + memcpy(exp_pdu_data->tlv_buffer+i, pinfo->net_src.data, EXP_PDU_TAG_IPV4_SRC_LEN); + i += EXP_PDU_TAG_IPV4_SRC_LEN; + }else if(pinfo->net_src.type == AT_IPv6){ exp_pdu_data->tlv_buffer[i] = 0; i++; exp_pdu_data->tlv_buffer[i] = EXP_PDU_TAG_IPV6_SRC; @@ -145,10 +156,9 @@ load_export_pdu_tags(packet_info *pinfo, const char* proto_name, int wtap_encap i++; exp_pdu_data->tlv_buffer[i] = EXP_PDU_TAG_IPV6_SRC_LEN; /* tag length */ i++; + memcpy(exp_pdu_data->tlv_buffer+i, pinfo->net_src.data, EXP_PDU_TAG_IPV6_SRC_LEN); + i += EXP_PDU_TAG_IPV6_SRC_LEN; } - - memcpy(exp_pdu_data->tlv_buffer+i, pinfo->net_src.data, 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){ @@ -161,7 +171,9 @@ load_export_pdu_tags(packet_info *pinfo, const char* proto_name, int wtap_encap i++; exp_pdu_data->tlv_buffer[i] = EXP_PDU_TAG_IPV4_DST_LEN; /* tag length */ i++; - }else{ + memcpy(exp_pdu_data->tlv_buffer+i, pinfo->net_dst.data, EXP_PDU_TAG_IPV4_DST_LEN); + i += EXP_PDU_TAG_IPV4_DST_LEN; + }else if(pinfo->net_dst.type == AT_IPv6){ exp_pdu_data->tlv_buffer[i] = 0; i++; exp_pdu_data->tlv_buffer[i] = EXP_PDU_TAG_IPV6_DST; @@ -170,10 +182,9 @@ load_export_pdu_tags(packet_info *pinfo, const char* proto_name, int wtap_encap i++; exp_pdu_data->tlv_buffer[i] = EXP_PDU_TAG_IPV6_DST_LEN; /* tag length */ i++; + memcpy(exp_pdu_data->tlv_buffer+i, pinfo->net_dst.data, EXP_PDU_TAG_IPV6_DST_LEN); + i += EXP_PDU_TAG_IPV6_DST_LEN; } - - memcpy(exp_pdu_data->tlv_buffer+i, pinfo->net_dst.data, pinfo->net_dst.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){ @@ -261,6 +272,50 @@ load_export_pdu_tags(packet_info *pinfo, const char* proto_name, int wtap_encap } } + if((tags_bit_field & EXP_PDU_TAG_SS7_OPC_BIT) == EXP_PDU_TAG_SS7_OPC_BIT){ + if(pinfo->src.type == AT_SS7PC){ + mtp3_addr_pc_t *mtp3_addr = (mtp3_addr_pc_t *)(pinfo->src.data); + exp_pdu_data->tlv_buffer[i] = 0; + i++; + exp_pdu_data->tlv_buffer[i] = EXP_PDU_TAG_SS7_OPC; + i++; + exp_pdu_data->tlv_buffer[i] = 0; + i++; + exp_pdu_data->tlv_buffer[i] = EXP_PDU_TAG_SS7_OPC_LEN; /* tag length */ + i++; + exp_pdu_data->tlv_buffer[i] = (mtp3_addr->pc & 0xff000000) >> 24; + exp_pdu_data->tlv_buffer[i+1] = (mtp3_addr->pc & 0x00ff0000) >> 16; + exp_pdu_data->tlv_buffer[i+2] = (mtp3_addr->pc & 0x0000ff00) >> 8; + exp_pdu_data->tlv_buffer[i+3] = (mtp3_addr->pc & 0x000000ff); + exp_pdu_data->tlv_buffer[i+4] = (mtp3_addr->type & 0xff00) >> 8; + exp_pdu_data->tlv_buffer[i+5] = (mtp3_addr->type & 0x00ff); + exp_pdu_data->tlv_buffer[i+6] = mtp3_addr->ni; + i += EXP_PDU_TAG_SS7_OPC_LEN; + } + } + + if((tags_bit_field & EXP_PDU_TAG_SS7_DPC_BIT) == EXP_PDU_TAG_SS7_DPC_BIT){ + if(pinfo->dst.type == AT_SS7PC){ + mtp3_addr_pc_t *mtp3_addr = (mtp3_addr_pc_t *)(pinfo->dst.data); + exp_pdu_data->tlv_buffer[i] = 0; + i++; + exp_pdu_data->tlv_buffer[i] = EXP_PDU_TAG_SS7_DPC; + i++; + exp_pdu_data->tlv_buffer[i] = 0; + i++; + exp_pdu_data->tlv_buffer[i] = EXP_PDU_TAG_SS7_DPC_LEN; /* tag length */ + i++; + exp_pdu_data->tlv_buffer[i] = (mtp3_addr->pc & 0xff000000) >> 24; + exp_pdu_data->tlv_buffer[i+1] = (mtp3_addr->pc & 0x00ff0000) >> 16; + exp_pdu_data->tlv_buffer[i+2] = (mtp3_addr->pc & 0x0000ff00) >> 8; + exp_pdu_data->tlv_buffer[i+3] = (mtp3_addr->pc & 0x000000ff); + exp_pdu_data->tlv_buffer[i+4] = (mtp3_addr->type & 0xff00) >> 8; + exp_pdu_data->tlv_buffer[i+5] = (mtp3_addr->type & 0x00ff); + exp_pdu_data->tlv_buffer[i+6] = mtp3_addr->ni; + i += EXP_PDU_TAG_SS7_DPC_LEN; + } + } + if((tags_bit_field & EXP_PDU_TAG_ORIG_FNO_BIT) == EXP_PDU_TAG_ORIG_FNO_BIT){ exp_pdu_data->tlv_buffer[i] = 0; i++; diff --git a/epan/exported_pdu.h b/epan/exported_pdu.h index c6399da35e..bff1d576b7 100644 --- a/epan/exported_pdu.h +++ b/epan/exported_pdu.h @@ -124,8 +124,8 @@ typedef struct _exp_pdu_data_t { #define EXP_PDU_TAG_SCTP_PPID_LEN 4 -#define EXP_PDU_TAG_SS7_OPC_LEN 4 -#define EXP_PDU_TAG_SS7_DPC_LEN 4 +#define EXP_PDU_TAG_SS7_OPC_LEN 8 /* 4 bytes PC, 2 bytes standard type, 1 byte NI, 1 byte padding */ +#define EXP_PDU_TAG_SS7_DPC_LEN 8 /* 4 bytes PC, 2 bytes standard type, 1 byte NI, 1 byte padding */ #define EXP_PDU_TAG_ORIG_FNO_LEN 4 |