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
3436static int proto_rsocket = -1 ;
37+ static int proto_rsocket_no_frame_length = -1 ;
3538
3639static int hf_rsocket_frame_len = -1 ;
3740static 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+
98102static 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
268272static 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
466502void 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