forked from osmocom/wireshark
Add export of SS7 OPC/DPC
svn path=/trunk/; revision=50060
This commit is contained in:
parent
19d2f6dac4
commit
014e2deec6
|
@ -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 }
|
||||
},
|
||||
|
|
|
@ -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++;
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue