aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-rnsap.c
diff options
context:
space:
mode:
authorDarien Spencer <cusneud@mail.com>2018-05-24 14:46:17 +0300
committerAnders Broman <a.broman58@gmail.com>2018-05-24 12:43:39 +0000
commit78f04d480091c659f4c534af572bf62c3299f127 (patch)
tree0baa259c7c0740cf99922d721a272362d9ea5220 /epan/dissectors/packet-rnsap.c
parentcd2d3dd6459ad8c4d47729b8affd1180183ddbb0 (diff)
RNSAP: Parse transportLayerAddress and bindingID
Parse IPv4/v6 and UDP ports Change-Id: I3cbab496b4c73c1d0a0dbc55be29add8eab60dea Reviewed-on: https://code.wireshark.org/review/27773 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/packet-rnsap.c')
-rw-r--r--epan/dissectors/packet-rnsap.c99
1 files changed, 88 insertions, 11 deletions
diff --git a/epan/dissectors/packet-rnsap.c b/epan/dissectors/packet-rnsap.c
index c6bc4151f1..c52ad2011e 100644
--- a/epan/dissectors/packet-rnsap.c
+++ b/epan/dissectors/packet-rnsap.c
@@ -28,6 +28,7 @@
#include <epan/asn1.h>
#include <epan/proto_data.h>
+#include "packet-isup.h"
#include "packet-per.h"
#include "packet-ber.h"
@@ -1264,7 +1265,7 @@ typedef enum _ProtocolIE_ID_enum {
} ProtocolIE_ID_enum;
/*--- End of included file: packet-rnsap-val.h ---*/
-#line 38 "./asn1/rnsap/packet-rnsap-template.c"
+#line 39 "./asn1/rnsap/packet-rnsap-template.c"
void proto_register_rnsap(void);
void proto_reg_handoff_rnsap(void);
@@ -1284,6 +1285,9 @@ static dissector_handle_t rrc_ul_ccch_handle = NULL;
/* Initialize the protocol and registered fields */
static int proto_rnsap = -1;
+static int hf_rnsap_transportLayerAddress_ipv4 = -1;
+static int hf_rnsap_transportLayerAddress_ipv6 = -1;
+static int hf_rnsap_transportLayerAddress_nsap = -1;
/*--- Included file: packet-rnsap-hf.c ---*/
#line 1 "./asn1/rnsap/packet-rnsap-hf.c"
@@ -4393,10 +4397,12 @@ static int hf_rnsap_value_04 = -1; /* UnsuccessfulOutcome_value *
static int hf_rnsap_value_05 = -1; /* Outcome_value */
/*--- End of included file: packet-rnsap-hf.c ---*/
-#line 58 "./asn1/rnsap/packet-rnsap-template.c"
+#line 62 "./asn1/rnsap/packet-rnsap-template.c"
/* Initialize the subtree pointers */
static int ett_rnsap = -1;
+static int ett_rnsap_transportLayerAddress = -1;
+static int ett_rnsap_transportLayerAddress_nsap = -1;
/*--- Included file: packet-rnsap-ett.c ---*/
@@ -5830,7 +5836,7 @@ static gint ett_rnsap_UnsuccessfulOutcome = -1;
static gint ett_rnsap_Outcome = -1;
/*--- End of included file: packet-rnsap-ett.c ---*/
-#line 63 "./asn1/rnsap/packet-rnsap-template.c"
+#line 69 "./asn1/rnsap/packet-rnsap-template.c"
/* Dissector tables */
@@ -7811,8 +7817,23 @@ dissect_rnsap_EDCH_MACdFlow_ID(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *ac
static int
dissect_rnsap_BindingID(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
+#line 158 "./asn1/rnsap/rnsap.cnf"
+ tvbuff_t *parameter_tvb=NULL;
+ guint16 binding_id_port;
+
offset = dissect_per_octet_string(tvb, offset, actx, tree, hf_index,
- 1, 4, TRUE, NULL);
+ 1, 4, TRUE, &parameter_tvb);
+
+
+ if (!parameter_tvb)
+ return offset;
+
+ if(tvb_reported_length(parameter_tvb)>=2){
+ binding_id_port = tvb_get_ntohs(parameter_tvb,0);
+ proto_item_append_text(actx->created_item, " (%u)",binding_id_port);
+ }
+
+
return offset;
}
@@ -7821,8 +7842,51 @@ dissect_rnsap_BindingID(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_,
static int
dissect_rnsap_TransportLayerAddress(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
+#line 174 "./asn1/rnsap/rnsap.cnf"
+ tvbuff_t *parameter_tvb = NULL;
+ proto_item *item;
+ proto_tree *subtree, *nsap_tree;
+ guint8 *padded_nsap_bytes;
+ tvbuff_t *nsap_tvb;
+ gint tvb_len;
+
offset = dissect_per_bit_string(tvb, offset, actx, tree, hf_index,
- 1, 160, TRUE, NULL, NULL);
+ 1, 160, TRUE, &parameter_tvb, NULL);
+
+ if (!parameter_tvb)
+ return offset;
+
+ /* Get the length */
+ tvb_len = tvb_reported_length(parameter_tvb);
+ subtree = proto_item_add_subtree(actx->created_item, ett_rnsap_transportLayerAddress);
+ if (tvb_len == 4){
+ /* IPv4 */
+ proto_tree_add_item(subtree, hf_rnsap_transportLayerAddress_ipv4, parameter_tvb, 0, tvb_len, ENC_BIG_ENDIAN);
+ }
+ if (tvb_len == 16){
+ /* IPv6 */
+ proto_tree_add_item(subtree, hf_rnsap_transportLayerAddress_ipv6, parameter_tvb, 0, tvb_len, ENC_NA);
+ }
+ if (tvb_len == 20 || tvb_len == 7){
+ /* NSAP */
+ if (tvb_len == 7){
+ /* Unpadded IPv4 NSAP */
+ /* Creating a new TVB with padding */
+ padded_nsap_bytes = (guint8*) wmem_alloc0(actx->pinfo->pool, 20);
+ tvb_memcpy(parameter_tvb, padded_nsap_bytes, 0, tvb_len);
+ nsap_tvb = tvb_new_child_real_data(tvb, padded_nsap_bytes, 20, 20);
+ add_new_data_source(actx->pinfo, nsap_tvb, "Padded NSAP Data");
+ }else{
+ /* Padded NSAP*/
+ nsap_tvb = parameter_tvb;
+ }
+ item = proto_tree_add_item(subtree, hf_rnsap_transportLayerAddress_nsap, parameter_tvb, 0, tvb_len, ENC_NA);
+ nsap_tree = proto_item_add_subtree(item, ett_rnsap_transportLayerAddress_nsap);
+ dissect_nsap(nsap_tvb, 0, 20, nsap_tree);
+ }
+
+
+
return offset;
}
@@ -49051,7 +49115,7 @@ static int dissect_NULL_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tre
/*--- End of included file: packet-rnsap-fn.c ---*/
-#line 96 "./asn1/rnsap/packet-rnsap-template.c"
+#line 102 "./asn1/rnsap/packet-rnsap-template.c"
static int dissect_ProtocolIEFieldValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
{
@@ -49193,8 +49257,19 @@ dissect_sccp_rnsap_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi
void proto_register_rnsap(void) {
/* List of fields */
-
static hf_register_info hf[] = {
+ { &hf_rnsap_transportLayerAddress_ipv4,
+ { "transportLayerAddress IPv4", "rnsap.transportLayerAddress_ipv4",
+ FT_IPv4, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
+ { &hf_rnsap_transportLayerAddress_ipv6,
+ { "transportLayerAddress IPv6", "rnsap.transportLayerAddress_ipv6",
+ FT_IPv6, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
+ { &hf_rnsap_transportLayerAddress_nsap,
+ { "transportLayerAddress NSAP", "rnsap.transportLayerAddress_NSAP",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
/*--- Included file: packet-rnsap-hfarr.c ---*/
#line 1 "./asn1/rnsap/packet-rnsap-hfarr.c"
@@ -61616,12 +61691,14 @@ void proto_register_rnsap(void) {
"Outcome_value", HFILL }},
/*--- End of included file: packet-rnsap-hfarr.c ---*/
-#line 240 "./asn1/rnsap/packet-rnsap-template.c"
+#line 257 "./asn1/rnsap/packet-rnsap-template.c"
};
/* List of subtrees */
static gint *ett[] = {
- &ett_rnsap,
+ &ett_rnsap,
+ &ett_rnsap_transportLayerAddress,
+ &ett_rnsap_transportLayerAddress_nsap,
/*--- Included file: packet-rnsap-ettarr.c ---*/
#line 1 "./asn1/rnsap/packet-rnsap-ettarr.c"
@@ -63054,7 +63131,7 @@ void proto_register_rnsap(void) {
&ett_rnsap_Outcome,
/*--- End of included file: packet-rnsap-ettarr.c ---*/
-#line 246 "./asn1/rnsap/packet-rnsap-template.c"
+#line 265 "./asn1/rnsap/packet-rnsap-template.c"
};
@@ -64014,7 +64091,7 @@ proto_reg_handoff_rnsap(void)
/*--- End of included file: packet-rnsap-dis-tab.c ---*/
-#line 280 "./asn1/rnsap/packet-rnsap-template.c"
+#line 299 "./asn1/rnsap/packet-rnsap-template.c"
}