aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/asn1
diff options
context:
space:
mode:
authorDarien Spencer <cusneud@mail.com>2017-10-21 17:48:40 +0300
committerAnders Broman <a.broman58@gmail.com>2017-10-26 07:10:03 +0000
commitf97befbaa57ff432958d014b007c909e04cd8ff9 (patch)
tree253362f96919b1ef3fdb0339b30ad7658c644bc4 /epan/dissectors/asn1
parentbfad9c56f9e65eafba00f97e5e649842782eb2e1 (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.c66
-rw-r--r--epan/dissectors/asn1/ranap/ranap.cnf40
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;