gsm_osmux: Add RTP Marker field
authorPau Espin Pedrol <pespin@sysmocom.de>
Tue, 9 May 2017 12:19:10 +0000 (14:19 +0200)
committerMichael Mann <mmann78@netscape.net>
Fri, 12 May 2017 03:10:01 +0000 (03:10 +0000)
GSM Osmux recently got support to bring RTP Marker (M) bit. It should be
mostly backwards compatible as the first bit was reserved and not used
before for the FieldType.

Support was added in libosmo-netif commit e98afe5808176efb60298a2f764e8e11efaf580b
This bit is documented in the protocol documentation recently available: http://ftp.osmocom.org/docs/latest/osmux-reference.pdf

Change-Id: Ia0508971519b3df9499d963404bb8a0e3c4b9c33
Reviewed-on: https://code.wireshark.org/review/21599
Petri-Dish: Pascal Quantin <pascal.quantin@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Jaap Keuter <jaap.keuter@xs4all.nl>
Reviewed-by: Michael Mann <mmann78@netscape.net>
epan/dissectors/packet-gsm_osmux.c
epan/dissectors/packet-gsm_osmux.h

index 039c3d76feca99cf7585b279237bcd6e95e6e5ca..d8b155c2be0d99876c04648bcb6efe7f819b4a90 100644 (file)
@@ -50,6 +50,7 @@ static int proto_osmux = -1;
 static int osmux_tap = -1;
 
 static int hf_osmux_ft_ctr = -1;
+static int hf_osmux_rtp_m = -1;
 static int hf_osmux_ft = -1;
 static int hf_osmux_ctr = -1;
 static int hf_osmux_amr_f = -1;
@@ -72,6 +73,7 @@ static gint
 dissect_osmux(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
 {
     static const gint *ft_ctr_fields[] = {
+        &hf_osmux_rtp_m,
         &hf_osmux_ft,
         &hf_osmux_ctr,
         &hf_osmux_amr_f,
@@ -100,7 +102,8 @@ dissect_osmux(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U
 
     ft_ctr = tvb_get_guint8(tvb, offset);
 
-    osmuxh->ft = ft_ctr >> 5;
+    osmuxh->rtp_m = ft_ctr >> 7;
+    osmuxh->ft = (ft_ctr >> 5) & 0x3;
     osmuxh->ctr = (ft_ctr >> 2) & 0x7;
     osmuxh->amr_q = !!(ft_ctr & 0x02);
     osmuxh->amr_f = !!(ft_ctr & 0x01);
@@ -123,6 +126,9 @@ dissect_osmux(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U
                     val_to_str(osmuxh->ft, osmux_ft_vals,
                                "unknown 0x%02x"));
 
+   if (osmuxh->rtp_m)
+       col_append_fstr(pinfo->cinfo, COL_INFO, "(M)");
+
     proto_tree_add_bitmask(osmux_tree, tvb, offset, hf_osmux_ft_ctr,
             ett_osmux_ft_ctr, ft_ctr_fields, ENC_BIG_ENDIAN);
     offset++;
@@ -153,6 +159,7 @@ static const gchar *st_str_pkts_by_ctr = "Osmux Packets by AMR frame count";
 static const gchar *st_str_pkts_by_src = "Osmux Packets by src Addr";
 static const gchar *st_str_pkts_by_dst = "Osmux Packets by dst Addr";
 static const gchar *st_str_pkts_by_conn = "Osmux Packets by stream";
+static const gchar *st_str_pkts_by_rtp_m = "Osmux Packets by RTP Marker";
 
 static int st_osmux_stats = -1;
 static int st_osmux_stats_cid = -1;
@@ -160,6 +167,7 @@ static int st_osmux_stats_ctr = -1;
 static int st_osmux_stats_src = -1;
 static int st_osmux_stats_dst = -1;
 static int st_osmux_stats_conn = -1;
+static int st_osmux_stats_rtp_m = -1;
 
 static void osmux_stats_tree_init(stats_tree *st)
 {
@@ -169,6 +177,7 @@ static void osmux_stats_tree_init(stats_tree *st)
     st_osmux_stats_src = stats_tree_create_node(st, st_str_pkts_by_src, st_osmux_stats, TRUE);
     st_osmux_stats_dst = stats_tree_create_node(st, st_str_pkts_by_dst, st_osmux_stats, TRUE);
     st_osmux_stats_conn = stats_tree_create_node(st, st_str_pkts_by_conn, st_osmux_stats, TRUE);
+    st_osmux_stats_rtp_m = stats_tree_create_node(st, st_str_pkts_by_rtp_m, st_osmux_stats, TRUE);
 }
 
 static int osmux_stats_tree_packet(stats_tree *st, packet_info *pinfo,
@@ -201,6 +210,10 @@ static int osmux_stats_tree_packet(stats_tree *st, packet_info *pinfo,
     g_snprintf(temp, 40, "%s->%s:%i", ip_str, ip2_str, osmuxh->circuit_id);
     tick_stat_node(st, temp, st_osmux_stats_conn, TRUE);
 
+    tick_stat_node(st, st_str_pkts_by_rtp_m, 0, FALSE);
+    g_snprintf(temp, 30, "%s", (osmuxh->rtp_m ? "Yes" : "No"));
+    tick_stat_node(st, temp, st_osmux_stats_rtp_m, TRUE);
+
     wmem_free(NULL, ip_str);
     wmem_free(NULL, ip2_str);
 
@@ -215,9 +228,14 @@ void proto_register_osmux(void)
           FT_UINT8, BASE_DEC, NULL, 0x00,
           "Byte with Fieldtype, Counter", HFILL}
         },
+        {&hf_osmux_rtp_m,
+         {"RTP Marker", "osmux.rtp_m",
+          FT_BOOLEAN, 8, NULL, 0x80,
+          "Type of data in packet", HFILL}
+         },
         {&hf_osmux_ft,
          {"FieldType", "osmux.ft",
-          FT_UINT8, BASE_DEC, VALS(osmux_ft_vals), 0xe0,
+          FT_UINT8, BASE_DEC, VALS(osmux_ft_vals), 0x60,
           "Type of data in packet", HFILL}
          },
         {&hf_osmux_ctr,
index 1e43b19edd8bf358e63a8ab1e8f0e6b0390e65e7..271485a0d6a3436cff81530c3fca2313eb76ea5b 100644 (file)
@@ -24,6 +24,7 @@
 
 /* Tap structure of Osmux header */
 struct osmux_hdr {
+    guint32 rtp_m;
     guint32 ft;
     guint32 ctr;
     guint32 amr_f;