summaryrefslogtreecommitdiffstats
path: root/epan/dissectors/asn1/goose
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-09-19 04:14:53 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-09-19 04:14:53 +0000
commita86c5f7cae7ec9a3398300555a0b644689d946a1 (patch)
tree39fe4b107c71174fd1e8a8ceb9a4d2aa14116248 /epan/dissectors/asn1/goose
parentReleasing progress-linux version 4.2.6-1~progress7.99u1. (diff)
downloadwireshark-a86c5f7cae7ec9a3398300555a0b644689d946a1.tar.xz
wireshark-a86c5f7cae7ec9a3398300555a0b644689d946a1.zip
Merging upstream version 4.4.0.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'epan/dissectors/asn1/goose')
-rw-r--r--epan/dissectors/asn1/goose/goose.cnf24
-rw-r--r--epan/dissectors/asn1/goose/packet-goose-template.c185
2 files changed, 85 insertions, 124 deletions
diff --git a/epan/dissectors/asn1/goose/goose.cnf b/epan/dissectors/asn1/goose/goose.cnf
index b0c84ffe..a47661b2 100644
--- a/epan/dissectors/asn1/goose/goose.cnf
+++ b/epan/dissectors/asn1/goose/goose.cnf
@@ -12,14 +12,14 @@ GOOSEpdu
#.FN_BODY IECGoosePdu/simulation VAL_PTR = &value
bool value;
- guint32 len = tvb_reported_length_remaining(tvb, offset);
+ uint32_t len = tvb_reported_length_remaining(tvb, offset);
int origin_offset = offset;
%(DEFAULT_BODY)s
if((actx->private_data) && (actx->created_item)){
goose_chk_data_t *data_chk = (goose_chk_data_t *)actx->private_data;
proto_tree *expert_inf_tree = NULL;
/* S bit set and Simulation attribute clear: reject as invalid GOOSE */
- if((data_chk->s_bit == TRUE) && (value == FALSE)){
+ if((data_chk->s_bit == true) && (value == false)){
/* It really looks better showed as a new subtree */
expert_inf_tree = proto_item_add_subtree(actx->created_item, ett_expert_inf_sim);
proto_tree_add_expert(expert_inf_tree, actx->pinfo, &ei_goose_invalid_sim, tvb, origin_offset, len);
@@ -29,19 +29,19 @@ GOOSEpdu
#.FN_BODY UtcTime
- guint32 len;
- guint32 seconds;
- guint32 fraction;
- guint32 nanoseconds;
+ uint32_t len;
+ uint32_t seconds;
+ uint32_t fraction;
+ uint32_t nanoseconds;
nstime_t ts;
- gchar * ptime;
+ char * ptime;
len = tvb_reported_length_remaining(tvb, offset);
if(len != 8)
{
proto_tree_add_expert(tree, actx->pinfo, &ei_goose_mal_utctime, tvb, offset, len);
- if(hf_index >= 0)
+ if(hf_index > 0)
{
proto_tree_add_string(tree, hf_index, tvb, offset, len, "????");
}
@@ -50,14 +50,14 @@ GOOSEpdu
seconds = tvb_get_ntohl(tvb, offset);
fraction = tvb_get_ntoh24(tvb, offset+4) * 0x100; /* Only 3 bytes are recommended */
- nanoseconds = (guint32)( ((guint64)fraction * G_GUINT64_CONSTANT(1000000000)) / G_GUINT64_CONSTANT(0x100000000) ) ;
+ nanoseconds = (uint32_t)( ((uint64_t)fraction * UINT64_C(1000000000)) / UINT64_C(0x100000000) ) ;
ts.secs = seconds;
ts.nsecs = nanoseconds;
- ptime = abs_time_to_str(actx->pinfo->pool, &ts, ABSOLUTE_TIME_UTC, TRUE);
+ ptime = abs_time_to_str(actx->pinfo->pool, &ts, ABSOLUTE_TIME_UTC, true);
- if(hf_index >= 0)
+ if(hf_index > 0)
{
proto_tree_add_string(tree, hf_index, tvb, offset, len, ptime);
}
@@ -69,7 +69,7 @@ GOOSEpdu
int len = tvb_reported_length_remaining(tvb, offset);
%(DEFAULT_BODY)s
- if ((len == FLOAT_ENC_LENGTH) && (tvb_get_guint8(tvb,0) == SINGLE_FLOAT_EXP_BITS) ){
+ if ((len == FLOAT_ENC_LENGTH) && (tvb_get_uint8(tvb,0) == SINGLE_FLOAT_EXP_BITS) ){
/* IEEE 754 single precision floating point */
proto_item_set_hidden(actx->created_item);
proto_tree_add_item(tree, hf_goose_float_value, tvb, 1, (FLOAT_ENC_LENGTH-1), ENC_BIG_ENDIAN);
diff --git a/epan/dissectors/asn1/goose/packet-goose-template.c b/epan/dissectors/asn1/goose/packet-goose-template.c
index 70a3914f..b378ff34 100644
--- a/epan/dissectors/asn1/goose/packet-goose-template.c
+++ b/epan/dissectors/asn1/goose/packet-goose-template.c
@@ -19,6 +19,7 @@
#include <epan/proto_data.h>
#include <epan/etypes.h>
#include <epan/expert.h>
+#include <wsutil/array.h>
#include "packet-ber.h"
#include "packet-acse.h"
@@ -35,40 +36,40 @@ void proto_register_goose(void);
void proto_reg_handoff_goose(void);
/* Initialize the protocol and registered fields */
-static int proto_goose = -1;
-static int proto_r_goose = -1;
-
-static int hf_goose_session_header = -1;
-static int hf_goose_spdu_id = -1;
-static int hf_goose_session_hdr_length = -1;
-static int hf_goose_hdr_length = -1;
-static int hf_goose_content_id = -1;
-static int hf_goose_spdu_lenth = -1;
-static int hf_goose_spdu_num = -1;
-static int hf_goose_version = -1;
-static int hf_goose_security_info = -1;
-static int hf_goose_current_key_t = -1;
-static int hf_goose_next_key_t = -1;
-static int hf_goose_key_id = -1;
-static int hf_goose_init_vec_length = -1;
-static int hf_goose_init_vec = -1;
-static int hf_goose_session_user_info = -1;
-static int hf_goose_payload = -1;
-static int hf_goose_payload_length = -1;
-static int hf_goose_apdu_tag = -1;
-static int hf_goose_apdu_simulation = -1;
-static int hf_goose_apdu_appid = -1;
-static int hf_goose_apdu_length = -1;
-static int hf_goose_padding_tag = -1;
-static int hf_goose_padding_length = -1;
-static int hf_goose_padding = -1;
-static int hf_goose_hmac = -1;
-static int hf_goose_appid = -1;
-static int hf_goose_length = -1;
-static int hf_goose_reserve1 = -1;
-static int hf_goose_reserve1_s_bit = -1;
-static int hf_goose_reserve2 = -1;
-static int hf_goose_float_value = -1;
+static int proto_goose;
+static int proto_r_goose;
+
+static int hf_goose_session_header;
+static int hf_goose_spdu_id;
+static int hf_goose_session_hdr_length;
+static int hf_goose_hdr_length;
+static int hf_goose_content_id;
+static int hf_goose_spdu_lenth;
+static int hf_goose_spdu_num;
+static int hf_goose_version;
+static int hf_goose_security_info;
+static int hf_goose_current_key_t;
+static int hf_goose_next_key_t;
+static int hf_goose_key_id;
+static int hf_goose_init_vec_length;
+static int hf_goose_init_vec;
+static int hf_goose_session_user_info;
+static int hf_goose_payload;
+static int hf_goose_payload_length;
+static int hf_goose_apdu_tag;
+static int hf_goose_apdu_simulation;
+static int hf_goose_apdu_appid;
+static int hf_goose_apdu_length;
+static int hf_goose_padding_tag;
+static int hf_goose_padding_length;
+static int hf_goose_padding;
+static int hf_goose_hmac;
+static int hf_goose_appid;
+static int hf_goose_length;
+static int hf_goose_reserve1;
+static int hf_goose_reserve1_s_bit;
+static int hf_goose_reserve2;
+static int hf_goose_float_value;
/* Bit fields in the Reserved fields */
@@ -76,13 +77,13 @@ static int hf_goose_float_value = -1;
/* GOOSE stored data for expert info verifications */
typedef struct _goose_chk_data{
- gboolean s_bit;
+ bool s_bit;
}goose_chk_data_t;
#define GOOSE_CHK_DATA_LEN (sizeof(goose_chk_data_t))
-static expert_field ei_goose_mal_utctime = EI_INIT;
-static expert_field ei_goose_zero_pdu = EI_INIT;
-static expert_field ei_goose_invalid_sim = EI_INIT;
+static expert_field ei_goose_mal_utctime;
+static expert_field ei_goose_zero_pdu;
+static expert_field ei_goose_invalid_sim;
#define SINGLE_FLOAT_EXP_BITS 8
#define FLOAT_ENC_LENGTH 5
@@ -90,22 +91,21 @@ static expert_field ei_goose_invalid_sim = EI_INIT;
#include "packet-goose-hf.c"
/* Initialize the subtree pointers */
-static int ett_r_goose = -1;
-static int ett_session_header = -1;
-static int ett_security_info = -1;
-static int ett_session_user_info = -1;
-static int ett_payload = -1;
-static int ett_padding = -1;
-static int ett_goose = -1;
-static int ett_reserve1 = -1;
-static int ett_expert_inf_sim = -1;
+static int ett_r_goose;
+static int ett_session_header;
+static int ett_security_info;
+static int ett_session_user_info;
+static int ett_payload;
+static int ett_padding;
+static int ett_goose;
+static int ett_reserve1;
+static int ett_expert_inf_sim;
#include "packet-goose-ett.c"
#include "packet-goose-fn.c"
-static dissector_handle_t goose_handle = NULL;
-static dissector_handle_t ositp_handle = NULL;
+static dissector_handle_t goose_handle;
#define OSI_SPDU_TUNNELED 0xA0 /* Tunneled */
@@ -143,15 +143,15 @@ static int
dissect_goose(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree,
void* data _U_)
{
- guint32 offset = 0;
- guint32 old_offset;
- guint32 length;
- guint32 reserve1_val;
+ uint32_t offset = 0;
+ uint32_t old_offset;
+ uint32_t length;
+ uint32_t reserve1_val;
proto_item *item = NULL;
proto_tree *tree = NULL;
goose_chk_data_t *data_chk = NULL;
asn1_ctx_t asn1_ctx;
- asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
+ asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, true, pinfo);
static int * const reserve1_flags[] = {
&hf_goose_reserve1_s_bit,
@@ -177,16 +177,16 @@ dissect_goose(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree,
ENC_BIG_ENDIAN, &length);
/* Reserved 1 */
- reserve1_val = tvb_get_guint16(tvb, offset + 4, ENC_BIG_ENDIAN);
+ reserve1_val = tvb_get_uint16(tvb, offset + 4, ENC_BIG_ENDIAN);
proto_tree_add_bitmask_value(tree, tvb, offset + 4, hf_goose_reserve1, ett_reserve1,
reserve1_flags, reserve1_val);
/* Store the header sim value for later expert info checks */
if(data_chk){
if(reserve1_val & F_RESERVE1_S_BIT){
- data_chk->s_bit = TRUE;
+ data_chk->s_bit = true;
}else{
- data_chk->s_bit = FALSE;
+ data_chk->s_bit = false;
}
}
@@ -198,7 +198,7 @@ dissect_goose(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree,
offset = 8;
while (offset < length){
old_offset = offset;
- offset = dissect_goose_GOOSEpdu(FALSE, tvb, offset, &asn1_ctx , tree, -1);
+ offset = dissect_goose_GOOSEpdu(false, tvb, offset, &asn1_ctx , tree, -1);
if (offset == old_offset) {
proto_tree_add_expert(tree, pinfo, &ei_goose_zero_pdu, tvb, offset, -1);
break;
@@ -216,14 +216,14 @@ static int
dissect_rgoose(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree,
void* data _U_)
{
- guint offset = 0, old_offset = 0;
- guint32 init_v_length, payload_tag, padding_length, length;
- guint32 payload_length, apdu_offset = 0, apdu_length, apdu_simulation;
+ unsigned offset = 0, old_offset = 0;
+ uint32_t init_v_length, payload_tag, padding_length, length;
+ uint32_t payload_length, apdu_offset = 0, apdu_length, apdu_simulation;
proto_item *item = NULL;
proto_tree *tree = NULL, *r_goose_tree = NULL, *sess_user_info_tree = NULL;
goose_chk_data_t *data_chk = NULL;
asn1_ctx_t asn1_ctx;
- asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
+ asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, true, pinfo);
asn1_ctx.private_data = wmem_alloc(pinfo->pool, GOOSE_CHK_DATA_LEN);
data_chk = (goose_chk_data_t *)asn1_ctx.private_data;
@@ -325,9 +325,9 @@ dissect_rgoose(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree,
/* Store the header sim value for later expert info checks */
if(data_chk){
if(apdu_simulation){
- data_chk->s_bit = TRUE;
+ data_chk->s_bit = true;
}else{
- data_chk->s_bit = FALSE;
+ data_chk->s_bit = false;
}
}
@@ -339,7 +339,7 @@ dissect_rgoose(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree,
offset += 2;
old_offset = offset;
- offset = dissect_goose_GOOSEpdu(FALSE, tvb, offset, &asn1_ctx , tree, -1);
+ offset = dissect_goose_GOOSEpdu(false, tvb, offset, &asn1_ctx , tree, -1);
if (offset == old_offset) {
proto_tree_add_expert(tree, pinfo, &ei_goose_zero_pdu, tvb, offset, -1);
break;
@@ -348,7 +348,7 @@ dissect_rgoose(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree,
/* Check do we have padding bytes */
if ((tvb_captured_length(tvb) > offset) &&
- (tvb_get_guint8(tvb, offset) == 0xAF)) {
+ (tvb_get_uint8(tvb, offset) == 0xAF)) {
/* Padding subtree */
item = proto_tree_add_item(sess_user_info_tree, hf_goose_padding, tvb,
offset, -1, ENC_NA);
@@ -378,62 +378,27 @@ dissect_rgoose(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree,
return tvb_captured_length(tvb);
}
-static gboolean
+static bool
dissect_rgoose_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree,
void *data)
{
- guint8 spdu;
+ uint8_t spdu;
/* Check do we have at least min size of Session header bytes */
if (tvb_captured_length(tvb) < 27) {
- return FALSE;
+ return false;
}
/* Is it R-GOOSE? */
- spdu = tvb_get_guint8(tvb, 0);
+ spdu = tvb_get_uint8(tvb, 0);
if (spdu != OSI_SPDU_GOOSE) {
- return FALSE;
+ return false;
}
dissect_rgoose(tvb, pinfo, parent_tree, data);
- return TRUE;
+ return true;
}
-static gboolean
-dissect_cltp_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree,
- void *data _U_)
-{
- guint8 li, tpdu, spdu;
-
- /* First, check do we have at least 2 bytes (length + tpdu) */
- if (tvb_captured_length(tvb) < 2) {
- return FALSE;
- }
-
- li = tvb_get_guint8(tvb, 0);
-
- /* Is it OSI on top of the UDP? */
- tpdu = (tvb_get_guint8(tvb, 1) & 0xF0) >> 4;
- if (tpdu != 0x4) {
- return FALSE;
- }
-
- /* Check do we have SPDU ID byte, too */
- if (tvb_captured_length(tvb) < (guint) (li + 2)) {
- return FALSE;
- }
-
- /* And let's see if it is GOOSE SPDU */
- spdu = tvb_get_guint8(tvb, li + 1);
- if (spdu != OSI_SPDU_GOOSE) {
- return FALSE;
- }
-
- call_dissector(ositp_handle, tvb, pinfo, parent_tree);
- return TRUE;
-}
-
-
/*--- proto_register_goose -------------------------------------------*/
void proto_register_goose(void) {
@@ -568,7 +533,7 @@ void proto_register_goose(void) {
};
/* List of subtrees */
- static gint *ett[] = {
+ static int *ett[] = {
&ett_r_goose,
&ett_session_header,
&ett_security_info,
@@ -614,10 +579,6 @@ void proto_reg_handoff_goose(void) {
dissector_add_uint("ethertype", ETHERTYPE_IEC61850_GOOSE, goose_handle);
- ositp_handle = find_dissector_add_dependency("ositp", proto_goose);
-
- heur_dissector_add("udp", dissect_cltp_heur,
- "CLTP over UDP", "cltp_udp", proto_goose, HEURISTIC_ENABLE);
heur_dissector_add("cltp", dissect_rgoose_heur,
"R-GOOSE (GOOSE over CLTP)", "rgoose_cltp", proto_goose, HEURISTIC_ENABLE);
}