Skip to content

Commit 41ca991

Browse files
committed
Add support for websocket
- Add dissector for 'no frame length field' protocols - Register dissector with websocket - Listen for traffic on fixed port 9897 (It's not possible to use the 'decode as' option for the websocket protocol)
1 parent 48cef9c commit 41ca991

File tree

1 file changed

+55
-13
lines changed

1 file changed

+55
-13
lines changed

packet-rsocket.c

Lines changed: 55 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,13 @@
2828
#include <epan/expert.h>
2929
#include <epan/packet.h>
3030
#include <epan/prefs.h>
31+
#include <stdio.h>
3132

32-
#define RSOCKET_TCP_PORT 9898 /* Not IANA registed */
33+
#define RSOCKET_TCP_PORT 9898 /* Not IANA registered */
34+
#define RSOCKET_WEBSOCKET_PORT 9897 /* Not IANA registered */
3335

3436
static int proto_rsocket = -1;
37+
static int proto_rsocket_no_frame_length = -1;
3538

3639
static int hf_rsocket_frame_len = -1;
3740
static int hf_rsocket_stream_id = -1;
@@ -95,6 +98,7 @@ static const value_string errorCodeNames[] = {
9598
{0x00000202, "REJECTED"}, {0x00000203, "CANCELED"},
9699
{0x00000204, "INVALID"}, {0xFFFFFFFF, "REJECTED"}};
97100

101+
98102
static const gchar *getFrameTypeName(const guint64 frame_type) {
99103
for (unsigned long i = 0; i < sizeof(frameTypeNames) / sizeof(value_string);
100104
i++) {
@@ -266,20 +270,44 @@ static gint read_rsocket_error_frame(proto_tree *tree, tvbuff_t *tvb,
266270
}
267271

268272
static int dissect_rsocket(tvbuff_t *tvb, packet_info *pinfo,
269-
proto_tree *tree _U_, void *data _U_) {
270-
col_set_str(pinfo->cinfo, COL_PROTOCOL, "RSOCKET");
273+
proto_tree *tree, gint frame_length_field_size);
274+
275+
static int frame_length_field_dissector(tvbuff_t *tvb, packet_info *pinfo,
276+
proto_tree *tree, void *data _U_) {
277+
return dissect_rsocket(tvb, pinfo, tree, frame_len_field_size);
278+
}
279+
280+
static int no_frame_length_field_dissector(tvbuff_t *tvb, packet_info *pinfo,
281+
proto_tree *tree, void *data _U_) {
282+
return dissect_rsocket(tvb, pinfo, tree, 0);
283+
}
284+
285+
static int dissect_rsocket(tvbuff_t *tvb, packet_info *pinfo,
286+
proto_tree *tree, gint frame_length_field_size) {
287+
271288
col_clear(pinfo->cinfo, COL_INFO);
289+
col_set_str(pinfo->cinfo, COL_PROTOCOL, "RSOCKET");
272290

273291
gint offset = 0;
292+
274293
proto_item *ti =
275294
proto_tree_add_item(tree, proto_rsocket, tvb, offset, -1, ENC_NA);
276295
proto_tree *rsocket_tree = proto_item_add_subtree(ti, ett_rsocket);
277296

278297
guint32 frame_len;
279-
proto_tree_add_item_ret_uint(rsocket_tree, hf_rsocket_frame_len, tvb, offset,
280-
frame_len_field_size, ENC_BIG_ENDIAN,
281-
&frame_len);
282-
offset += frame_len_field_size;
298+
299+
if(frame_length_field_size > 0) {
300+
proto_tree_add_item_ret_uint(rsocket_tree,
301+
hf_rsocket_frame_len,
302+
tvb,
303+
offset,
304+
frame_length_field_size,
305+
ENC_BIG_ENDIAN,
306+
&frame_len);
307+
offset += frame_length_field_size;
308+
} else {
309+
frame_len = tvb_captured_length(tvb);
310+
}
283311

284312
proto_item *rframe;
285313
proto_tree *rframe_tree = proto_tree_add_subtree(
@@ -343,17 +371,18 @@ static int dissect_rsocket(tvbuff_t *tvb, packet_info *pinfo,
343371
col_append_fstr(pinfo->cinfo, COL_INFO, " MetadataLen=%d", mdata_len);
344372
}
345373

346-
guint32 data_len = frame_len + 3 - offset;
374+
guint32 data_len = frame_len + frame_length_field_size - offset;
375+
347376
if (data_len > 0) {
348377
proto_tree_add_item(rframe_tree, hf_rsocket_data, tvb, offset, data_len,
349378
ENC_BIG_ENDIAN);
350379
offset += data_len;
380+
351381
col_append_fstr(pinfo->cinfo, COL_INFO, " DataLen=%d", data_len);
352382
}
353383

354-
if ((guint32)offset != frame_len + frame_len_field_size) {
355-
expert_add_info_format(pinfo, tree, &ei_rsocket_frame_len_mismatch,
356-
"Frame Length doesnt match");
384+
if ((guint32)offset != frame_len + frame_length_field_size) {
385+
expert_add_info_format(pinfo, tree, &ei_rsocket_frame_len_mismatch, "Frame Length doesnt match");
357386
}
358387

359388
return tvb_captured_length(tvb);
@@ -450,6 +479,13 @@ void proto_register_rsocket(void) {
450479
"RSocket", /* short name */
451480
"rsocket" /* abbrev */
452481
);
482+
483+
proto_rsocket_no_frame_length = proto_register_protocol_in_name_only("RSocket - No Frame Length Field (WebSocket and Aeron)",
484+
"RSocket (websocket/aeron)",
485+
"rsocket",
486+
proto_rsocket,
487+
FT_PROTOCOL);
488+
453489
proto_register_field_array(proto_rsocket, hf, array_length(hf));
454490
proto_register_subtree_array(ett, array_length(ett));
455491

@@ -464,8 +500,14 @@ void proto_register_rsocket(void) {
464500
}
465501

466502
void proto_reg_handoff_rsocket(void) {
467-
static dissector_handle_t rsocket_handle;
468503

469-
rsocket_handle = create_dissector_handle(dissect_rsocket, proto_rsocket);
504+
static dissector_handle_t rsocket_handle,
505+
rsocket_no_frame_length_handle;
506+
507+
rsocket_handle = create_dissector_handle(frame_length_field_dissector, proto_rsocket);
508+
rsocket_no_frame_length_handle = create_dissector_handle(no_frame_length_field_dissector, proto_rsocket_no_frame_length);
509+
470510
dissector_add_uint("tcp.port", RSOCKET_TCP_PORT, rsocket_handle);
511+
dissector_add_uint("ws.port", RSOCKET_WEBSOCKET_PORT, rsocket_no_frame_length_handle);
471512
}
513+

0 commit comments

Comments
 (0)