diff options
author | Darien Spencer <cusneud@mail.com> | 2017-10-21 17:48:40 +0300 |
---|---|---|
committer | Anders Broman <a.broman58@gmail.com> | 2017-10-26 07:10:03 +0000 |
commit | f97befbaa57ff432958d014b007c909e04cd8ff9 (patch) | |
tree | 253362f96919b1ef3fdb0339b30ad7658c644bc4 /epan/dissectors/asn1 | |
parent | bfad9c56f9e65eafba00f97e5e649842782eb2e1 (diff) |
RANAP: Associate RTP dissector with CS streams
Change-Id: If02b8cc5110c70e50ae04d245c45b1d133ee7fd3
Reviewed-on: https://code.wireshark.org/review/24010
Petri-Dish: Anders Broman <a.broman58@gmail.com>
Tested-by: Petri Dish Buildbot
Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan/dissectors/asn1')
-rw-r--r-- | epan/dissectors/asn1/ranap/packet-ranap-template.c | 66 | ||||
-rw-r--r-- | epan/dissectors/asn1/ranap/ranap.cnf | 40 |
2 files changed, 106 insertions, 0 deletions
diff --git a/epan/dissectors/asn1/ranap/packet-ranap-template.c b/epan/dissectors/asn1/ranap/packet-ranap-template.c index 68e5f27512..fe48a19ba2 100644 --- a/epan/dissectors/asn1/ranap/packet-ranap-template.c +++ b/epan/dissectors/asn1/ranap/packet-ranap-template.c @@ -41,6 +41,7 @@ #include "packet-gsm_a_common.h" #include "packet-isup.h" #include "packet-s1ap.h" +#include "packet-rtp.h" #ifdef _MSC_VER /* disable: "warning C4146: unary minus operator applied to unsigned type, result still unsigned" */ @@ -83,6 +84,68 @@ static int ett_ranap_TransportLayerAddress_nsap = -1; #include "packet-ranap-ett.c" +/*****************************************************************************/ +/* Packet private data */ +/* For this dissector, all access to actx->private_data should be made */ +/* through this API, which ensures that they will not overwrite each other!! */ +/*****************************************************************************/ + + +typedef struct ranap_private_data_t +{ + guint32 transportLayerAddress_ipv4; + guint16 binding_id_port; +} ranap_private_data_t; + + +/* Helper function to get or create the private data struct */ +static ranap_private_data_t* ranap_get_private_data(asn1_ctx_t *actx) +{ + packet_info *pinfo = actx->pinfo; + ranap_private_data_t *private_data = (ranap_private_data_t *)p_get_proto_data(pinfo->pool, pinfo, proto_ranap, 0); + if(private_data != NULL ) { + return private_data; + } + else { + private_data = wmem_new0(pinfo->pool, ranap_private_data_t); + p_add_proto_data(pinfo->pool, pinfo, proto_ranap, 0, private_data); + return private_data; + } +} + +/* Helper function to reset the the private data struct */ +static void ranap_reset_private_data(packet_info *pinfo) +{ + p_remove_proto_data(pinfo->pool, pinfo, proto_ranap, 0); +} + +static guint32 private_data_get_transportLayerAddress_ipv4(asn1_ctx_t *actx) +{ + ranap_private_data_t *private_data = (ranap_private_data_t*)ranap_get_private_data(actx); + return private_data->transportLayerAddress_ipv4; +} + +static void private_data_set_transportLayerAddress_ipv4(asn1_ctx_t *actx, guint32 transportLayerAddress_ipv4) +{ + ranap_private_data_t *private_data = (ranap_private_data_t*)ranap_get_private_data(actx); + private_data->transportLayerAddress_ipv4 = transportLayerAddress_ipv4; +} + +static guint16 private_data_get_binding_id_port(asn1_ctx_t *actx) +{ + ranap_private_data_t *private_data = (ranap_private_data_t*)ranap_get_private_data(actx); + return private_data->binding_id_port; +} + +static void private_data_set_binding_id_port(asn1_ctx_t *actx, guint16 binding_id_port) +{ + ranap_private_data_t *private_data = (ranap_private_data_t*)ranap_get_private_data(actx); + private_data->binding_id_port = binding_id_port; +} + +/*****************************************************************************/ + + /* Global variables */ static guint32 ProcedureCode; static guint32 ProtocolIE_ID; @@ -246,6 +309,9 @@ dissect_ranap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data) through function calls */ p_add_proto_data(pinfo->pool, pinfo, proto_ranap, pinfo->curr_layer_num, data); + /* Clearing any old 'private data' stored */ + ranap_reset_private_data(pinfo); + dissect_RANAP_PDU_PDU(tvb, pinfo, ranap_tree, NULL); if (sccp_msg_lcl) { diff --git a/epan/dissectors/asn1/ranap/ranap.cnf b/epan/dissectors/asn1/ranap/ranap.cnf index e281c7ef0f..cba0bea86f 100644 --- a/epan/dissectors/asn1/ranap/ranap.cnf +++ b/epan/dissectors/asn1/ranap/ranap.cnf @@ -323,6 +323,7 @@ MAX_VAL = asn1_param_get_integer(%(ACTX)s,"upperBound") if (tvb_len==4){ /* IPv4 */ proto_tree_add_item(subtree, hf_ranap_transportLayerAddress_ipv4, parameter_tvb, 0, tvb_len, ENC_BIG_ENDIAN); + private_data_set_transportLayerAddress_ipv4(actx, tvb_get_ipv4(parameter_tvb, 0)); } if (tvb_len==16){ /* IPv6 */ @@ -332,6 +333,10 @@ MAX_VAL = asn1_param_get_integer(%(ACTX)s,"upperBound") if ((tvb_len==20) || (tvb_len==25)) { item = proto_tree_add_item(subtree, hf_ranap_transportLayerAddress_nsap, parameter_tvb, 0, 20, ENC_NA); nsap_tree = proto_item_add_subtree(item, ett_ranap_TransportLayerAddress_nsap); + if(tvb_get_ntoh24(parameter_tvb,0) == 0x350001){ + /* IPv4 */ + private_data_set_transportLayerAddress_ipv4(actx, tvb_get_ipv4(parameter_tvb, 3)); + } dissect_nsap(parameter_tvb, 0, tvb_len, nsap_tree); } @@ -392,6 +397,7 @@ MAX_VAL = asn1_param_get_integer(%(ACTX)s,"upperBound") if (tvb_get_ntohs(value_tvb, 2) == 0) { /* Will show first 2 bytes as an integer, as very likely to be a UDP port number */ guint16 port_number = tvb_get_ntohs(value_tvb, 0); + private_data_set_binding_id_port(actx, port_number); proto_item_append_text(actx->created_item, " (%%u)", port_number); } @@ -402,6 +408,40 @@ MAX_VAL = asn1_param_get_integer(%(ACTX)s,"upperBound") if (value_tvb) dissect_s1ap_UE_HistoryInformation_PDU(value_tvb, %(ACTX)s->pinfo, tree, NULL); +#.FN_BODY RAB-SetupOrModifyItemFirst + address ipv4_addr; + guint32 transportLayerAddress_ipv4; + guint16 binding_id; + + private_data_set_transportLayerAddress_ipv4(actx, 0); + private_data_set_binding_id_port(actx, 0); +%(DEFAULT_BODY)s + transportLayerAddress_ipv4 = private_data_get_transportLayerAddress_ipv4(actx); + binding_id = private_data_get_binding_id_port(actx); + if (actx->pinfo->fd->flags.visited || transportLayerAddress_ipv4 == 0 || binding_id == 0){ + return offset; + } + set_address(&ipv4_addr, AT_IPv4, 4, &transportLayerAddress_ipv4); + /* Set RTP dissector for the UDP stream of this RAB */ + rtp_add_address(actx->pinfo, PT_UDP, &ipv4_addr, binding_id, 0, "RANAP", actx->pinfo->num, FALSE, 0); + +#.FN_BODY RAB-SetupOrModifiedItem + address ipv4_addr; + guint32 transportLayerAddress_ipv4; + guint16 binding_id; + + private_data_set_transportLayerAddress_ipv4(actx, 0); + private_data_set_binding_id_port(actx, 0); +%(DEFAULT_BODY)s + transportLayerAddress_ipv4 = private_data_get_transportLayerAddress_ipv4(actx); + binding_id = private_data_get_binding_id_port(actx); + if (actx->pinfo->fd->flags.visited || transportLayerAddress_ipv4 == 0 || binding_id == 0){ + return offset; + } + set_address(&ipv4_addr, AT_IPv4, 4, &transportLayerAddress_ipv4); + /* Set RTP dissector for the UDP stream of this RAB */ + rtp_add_address(actx->pinfo, PT_UDP, &ipv4_addr, binding_id, 0, "RANAP", actx->pinfo->num, FALSE, 0); + # Contains the BSSGP RIM PDU as defined in TS 48.018 [36]. #.FN_BODY RIMInformation VAL_PTR=&value_tvb tvbuff_t *value_tvb = NULL; |