From Lukas Pokorny: RTPS (Real-Time Publish-Subscribe) support.
authorguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>
Sat, 17 Apr 2004 21:43:32 +0000 (21:43 +0000)
committerguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>
Sat, 17 Apr 2004 21:43:32 +0000 (21:43 +0000)
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@10630 f5534014-38df-0310-8fa8-9805f1628bb7

AUTHORS
Makefile.common
doc/ethereal.pod
epan/Makefile.common
packet-rtps.c [new file with mode: 0644]
packet-rtps.h [new file with mode: 0644]

diff --git a/AUTHORS b/AUTHORS
index 6682039098ed922b3718b30243ca7e9b266c541e..4f9bc8e71ad901379b77b43d36590154fe007b3e 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -2090,6 +2090,10 @@ Love H
        libraries to decrypt kerberos encrypted blobs.
 }
 
+Lukas Pokorny <maskis [AT] seznam.cz> {
+       RTPS (Real-Time Publish-Subscribe) support
+}
+
 And assorted fixes and enhancements by the people listed above and by:
 
        Pavel Roskin <proski [AT] gnu.org>
index d18f8035177a17c635df42f5f7d4f578486ddc06..af757fe98c7801e4586dfb2cef81ecb39cd5b6bf 100644 (file)
@@ -3,7 +3,7 @@
 #     a) common to both files and
 #     b) portable between both files
 #
-# $Id: Makefile.common,v 1.38 2004/03/30 18:55:46 guy Exp $
+# $Id: Makefile.common,v 1.39 2004/04/17 21:43:32 guy Exp $
 #
 # Ethereal - Network traffic analyzer
 # By Gerald Combs <gerald@ethereal.com>
@@ -162,6 +162,7 @@ DISSECTOR_INCLUDES =        \
        packet-rsvp.h   \
        packet-rtcp.h   \
        packet-rtp.h    \
+       packet-rtps.h   \
        packet-rtp-events.h     \
        packet-rwall.h  \
        packet-rx.h     \
index 43abec66af67e53f117f55801066f07d040b7f27..685b4b44f030cd62d50dcde4e05ff91c59789095 100644 (file)
@@ -2138,6 +2138,7 @@ B<http://www.ethereal.com>.
   Jelmer Vernooij          <jelmer [AT] samba.org>
   Duncan Sargeant          <dunc-ethereal-dev [AT] rcpt.to>
   Love Hörnquist Ã…strand   <lha [AT] it.su.se>
+  Lukas Pokorny            <maskis [AT] seznam.cz>
   Pavel Roskin             <proski [AT] gnu.org>
   Georgi Guninski          <guninski [AT] guninski.com>
   Jason Copenhaver         <jcopenha [AT] typedef.org>
index b36da7ae9c6086ac70b3322ae6a6a74f14ee9764..a1df99921648d0720e00fe6665c99382421f62b3 100644 (file)
@@ -3,7 +3,7 @@
 #     a) common to both files and
 #     b) portable between both files
 #
-# $Id: Makefile.common,v 1.16 2004/04/13 04:36:20 guy Exp $
+# $Id: Makefile.common,v 1.17 2004/04/17 21:43:32 guy Exp $
 #
 # Ethereal - Network traffic analyzer
 # By Gerald Combs <gerald@ethereal.com>
@@ -383,6 +383,7 @@ DISSECTOR_SRC =     \
        ../packet-rtcp.c        \
        ../packet-rtp-events.c  \
        ../packet-rtp.c \
+       ../packet-rtps.c \
        ../packet-rtsp.c        \
        ../packet-rwall.c       \
        ../packet-rx.c  \
diff --git a/packet-rtps.c b/packet-rtps.c
new file mode 100644 (file)
index 0000000..eb50357
--- /dev/null
@@ -0,0 +1,1748 @@
+/* packet-rtps.c
+ * Routines for Real-Time Publish-Subscribe Protocol (RTPS) dissection
+ *
+ * Copyright 2003, LUKAS POKORNY <maskis@seznam.cz>
+ *                 PETR SMOLIK   <petr.smolik@wo.cz>
+ *                 ZDENEK SEBEK  <sebek@fel.cvut.cz>
+ * 
+ * Czech Technical University in Prague 
+ *  Faculty of Electrical Engineering <www.fel.cvut.cz>
+ *  Department of Control Engineering <dce.felk.cvut.cz>                
+ *                   
+ * version: 2004/04/15 9:40:45
+ * dedication to Kj :]
+ *
+ * $Id: packet-rtps.c,v 1.1 2004/04/17 21:43:32 guy Exp $
+ *
+ * Ethereal - Network traffic analyzer
+ * By Gerald Combs <gerald@ethereal.com>
+ * Copyright 1998 Gerald Combs
+ *
+ * Copied from packet-udp.c, packet-tftp.c, packet-x25.c
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * *********************************************************************** */
+
+ #ifdef HAVE_CONFIG_H
+ # include "config.h"
+ #endif
+
+ #ifdef NEED_SNPRINTF_H
+ # include "snprintf.h"
+ #endif
+
+ #include  <stdio.h>
+ #include  <stdlib.h>
+ #include  <string.h>
+ #include  <glib.h>
+ #include  <epan/packet.h>
+ #include  <epan/resolv.h>
+ #include  <epan/conversation.h>
+
+
+/* *********************************************************************** *
+   RTPS protocol was developed by Real Time Innovation, Inc.
+
+   Protocol specifikation and documenation you can find on these addresses:
+
+   http://www.rti.com/
+
+   http://www.rti.com/products/ndds/literature.html
+
+   http://www.schneider-electric.com.au/Products/Automation/TF_RealTime/
+         /technical%20library/specifications/WireProtocolExternal.pdf
+
+
+ * *********************************************************************** */
+
+
+
+/* redefine types because of definitions in 'packet-rtps.h' */
+/*
+ #define  u_int8_t           guint8
+ #define  int8_t             gint8
+
+ #define  u_int16_t          guint16
+ #define  int16_t            gint16
+
+ #define  u_int32_t          guint32
+ #define  int32_t            gint32
+*/
+
+#include "packet-rtps.h"
+
+ /*  Swap bytes in 16 bit value.  */
+ #define bswap_16(x) \
+     ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8))
+
+
+ /*  Swap bytes in 32 bit value.  */
+ #define bswap_32(x) \
+     ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >>  8) | \
+      (((x) & 0x0000ff00) <<  8) | (((x) & 0x000000ff) << 24))
+
+
+/* number of APP_KIND byte in packet header */
+ #define  APP_KIND_BYTE          15
+
+
+/*  definitions of flags */
+ #define    FLAG_E      0x01
+ #define    FLAG_F      0x02
+ #define    FLAG_I      0x02
+ #define    FLAG_M      0x02
+ #define    FLAG_P      0x02
+ #define    FLAG_A      0x04
+ #define    FLAG_H      0x08
+
+
+/*  submessageId's ranges  */
+ #define  SUBMSG_ID_MIN     PAD
+ #define  SUBMSG_ID_MAX     INFO_DST
+
+/*  Vendor specific submessageId's ranges */
+ #define  VENDOR_SUBMSG_ID_MIN      0x80
+ #define  VENDOR_SUBMSG_ID_MAX      0xff
+
+/* *********************************************************************** */
+
+
+/*  initialize the protocol and registered fields  */
+static int proto_rtps                  = -1;
+static int hf_rtps_submessage_flags    = -1;
+static int hf_rtps_issue_data          = -1;
+
+/*  Initialize the subtree pointers */
+static gint ett_rtps                   = -1;
+static gint ett_rtps_submessage        = -1;
+static gint ett_rtps_bitmap            = -1;
+
+/*  Functions declarations */
+static void dissect_PAD(tvbuff_t *tvb,gint offset,proto_tree *tree);
+static void dissect_VAR(tvbuff_t *tvb,gint offset,proto_tree *tree);
+static void dissect_ISSUE(tvbuff_t *tvb,gint offset,proto_tree *tree);
+static void dissect_ACK(tvbuff_t *tvb,gint offset,proto_tree *tree);
+static void dissect_HEARTBEAT(tvbuff_t *tvb,gint offset,proto_tree *tree);
+static void dissect_GAP(tvbuff_t *tvb,gint offset,proto_tree *tree);
+static void dissect_INFO_TS(tvbuff_t *tvb,gint offset,proto_tree *tree);
+static void dissect_INFO_SRC(tvbuff_t *tvb,gint offset,proto_tree *tree);
+static void dissect_INFO_REPLY(tvbuff_t *tvb,gint offset,proto_tree *tree);
+static void dissect_INFO_DST(tvbuff_t *tvb,gint offset,proto_tree *tree);
+
+static guint16  get_guint16(tvbuff_t *tvb, gint offset, gint16 e_bit);
+static guint32  get_guint32(tvbuff_t *tvb, gint offset, gint16 e_bit);
+
+static char *protocol_version_to_string(gint offset,tvbuff_t *tvb,char *buff);
+static char *vendor_id_to_string(gint offset, tvbuff_t *tvb, char *buff);
+
+static char *host_id_to_string(gint offset,tvbuff_t *tvb, char buff[]);
+static char *app_id_to_string(gint offset,tvbuff_t *tvb,char buff[]);
+static char *object_id_to_string(gint offset, tvbuff_t *tvb, char buff[]);
+
+static char *IP_to_string(gint offset,tvbuff_t *tvb,gint16 e_bit,char buff[]);
+static char *port_to_string(gint offset,tvbuff_t *tvb,gint16 e_bit,char buff[]);
+static char *get_NtpTime(gint offset,tvbuff_t *tvb,gint16 e_bit,char buff[]);
+
+static void  get_bitmap(tvbuff_t *tvb, gint *p_offset, gint16 e_bit,
+                        guint16 next_submsg, proto_tree *tree);
+
+static char *get_parameter(gint offset, tvbuff_t *tvb, gint16 e_bit, char buff[],
+                           guint16 parameter, guint16 param_length);
+
+static gint  seq_nr_to_string( gint offset, gint16 e_bit, tvbuff_t *tvb,
+                             SequenceNumber *p_seqNumber);
+
+/*  global variable - submessage ENDIAN */
+static gint16    e_bit = -1;
+
+
+
+/* *********************************************************************** */
+
+
+/* *********************************************************************** *
+ *                                                                         *
+ *                  Code to actually dissect the packets                   *
+ *                                                                         *
+ * *********************************************************************** */
+
+static gboolean
+dissect_rtps(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+{
+  proto_item       *ti;
+  proto_tree       *rtps_tree=NULL;
+  gint             offset = 0;
+  gint             message_len = 0;
+  gint             appKind = 0;
+  guint8           submessageId = 0;
+  int              next_submsg = 0;
+  int              count_msg_type[11];
+  char             buff[200], buff_tmp[30];/* buffers */
+
+  /*  offset is the byte offset of 'tvb' at which the new tvbuff
+      should start.  The first byte is the 0th byte.             */
+
+  message_len = tvb_length(tvb);
+
+  /* --- making disition if protocol is RTPS protocol --- */
+  if (tvb_get_guint8(tvb,offset++) != 'R') return FALSE;
+  if (tvb_get_guint8(tvb,offset++) != 'T') return FALSE;
+  if (tvb_get_guint8(tvb,offset++) != 'P') return FALSE;
+  if (tvb_get_guint8(tvb,offset++) != 'S') return FALSE;
+
+  /* --- Make entries in Protocol column ---*/
+  if (check_col(pinfo->cinfo, COL_PROTOCOL))
+   col_set_str(pinfo->cinfo, COL_PROTOCOL, "RTPS");
+
+  if (check_col(pinfo->cinfo, COL_INFO))
+   col_clear(pinfo->cinfo, COL_INFO);
+
+  memset(count_msg_type, 0, sizeof(count_msg_type));
+
+  if (tree) {
+
+   /* create display subtree for the protocol */
+   ti = proto_tree_add_item(tree, proto_rtps, tvb, 0, -1, FALSE);
+   rtps_tree = proto_item_add_subtree(ti, ett_rtps);
+
+   /* test which ENDIAN computer uses (this is set in 'config.h')*/
+   /*
+   #if WORDS_BIGENDIAN
+     proto_tree_add_text(rtps_tree, tvb, offset, 1,
+                         "WORDS_BIGENDIAN %d",
+                         WORDS_BIGENDIAN);
+   #else
+     proto_tree_add_text(rtps_tree, tvb, offset, 1,
+                         "WORDS_BIGENDIAN 0");
+   #endif
+  */
+
+   /*  Protocol Version */
+   proto_tree_add_text(rtps_tree, tvb, offset, 2,
+                       "Protocol  RTPS, version %s",
+                       protocol_version_to_string(offset, tvb, buff));
+   offset +=2;
+
+   /*  Vendor Id  */
+   proto_tree_add_text(rtps_tree, tvb, offset, 2,
+                       "VendorId: %s",
+                       vendor_id_to_string(offset, tvb, buff));
+   offset +=2;
+
+   /*  Host Id  */
+   proto_tree_add_text(rtps_tree, tvb, offset, 4,
+                       "HostId:   %s",
+                       host_id_to_string(offset,tvb,buff));
+   offset +=4;
+
+   /*  App Id  */
+   proto_tree_add_text(rtps_tree, tvb, offset, 4,
+                       "App ID:   %s",
+                       app_id_to_string(offset, tvb, buff));
+
+  }
+
+  /*  offset behind RTPS's Header */
+  offset=16;
+
+  do {
+    submessageId = tvb_get_guint8(tvb, offset);
+
+    //read value in littlendian format
+    next_submsg  = tvb_get_guint8(tvb, (offset+2))+
+                   tvb_get_guint8(tvb, (offset+3))*0x100;
+    #if WORDS_BIGENDIAN
+       bswap_16(next_submsg);
+    #endif
+
+    switch (submessageId)
+    {
+      case PAD:
+        if (tree)
+          dissect_PAD(tvb, offset, rtps_tree);
+        count_msg_type[0]++;
+        break;
+      case VAR:
+        if (tree)
+          dissect_VAR(tvb, offset, rtps_tree);
+        count_msg_type[1]++;
+        break;
+      case ISSUE:
+        if (tree)
+          dissect_ISSUE(tvb, offset, rtps_tree);
+        count_msg_type[2]++;
+        break;
+      case ACK:
+        if (tree)
+          dissect_ACK(tvb, offset, rtps_tree);
+        count_msg_type[3]++;
+        break;
+      case HEARTBEAT:
+        if (tree)
+          dissect_HEARTBEAT(tvb,offset, rtps_tree);
+        count_msg_type[4]++;
+        break;
+      case GAP:
+        if (tree)
+          dissect_GAP(tvb, offset, rtps_tree);
+        count_msg_type[5]++;
+        break;
+      case INFO_TS:
+        if (tree)
+          dissect_INFO_TS(tvb, offset, rtps_tree);
+        count_msg_type[6]++;
+        break;
+      case INFO_SRC:
+        if (tree)
+          dissect_INFO_SRC(tvb, offset, rtps_tree);
+        count_msg_type[7]++;
+        break;
+      case INFO_REPLY:
+        if (tree)
+          dissect_INFO_REPLY(tvb, offset, rtps_tree);
+        count_msg_type[8]++;
+        break;
+      case INFO_DST:
+        if (tree)
+          dissect_INFO_DST(tvb, offset, rtps_tree);
+        count_msg_type[9]++;
+        break;
+      default:
+        if (tree)
+          proto_tree_add_text(rtps_tree, tvb, offset, 1,
+                            "Submessage Id: Vendor-specific (0x%02x)",
+                            submessageId);
+        break;
+     }
+
+     /* next submessage's offset */
+     offset += next_submsg+4;
+
+  } while (offset<message_len);
+
+  /* --- and Info column on summary display ---*/
+
+  if (check_col(pinfo->cinfo, COL_INFO))
+  {
+    appKind = tvb_get_guint8(tvb, APP_KIND_BYTE);
+
+    if (appKind == MANAGEDAPPLICATION ) {sprintf(buff,"App: ");}
+    if (appKind == MANAGER)             {sprintf(buff,"Man: ");}
+    if (appKind == AID_UNKNOWN)         {sprintf(buff,"Unknown:");}
+
+    if (appKind != MANAGEDAPPLICATION  && appKind != MANAGER &&
+        appKind != AID_UNKNOWN)         {sprintf(buff,"ERROR in APP type");}
+
+   //-- counts of submessages - for Information Frame
+   if (count_msg_type[0]>0) {
+       sprintf(buff_tmp,"PAD(%d) ",count_msg_type[0]);
+       strcat(buff,buff_tmp);
+   }
+
+   if (count_msg_type[1]>0) {
+       sprintf(buff_tmp,"VAR(%d) ",count_msg_type[1]);
+       strcat(buff,buff_tmp);
+   }
+
+   if (count_msg_type[2]>0) {
+       sprintf(buff_tmp,"ISSUE(%d) ",count_msg_type[2]);
+       strcat(buff,buff_tmp);
+   }
+
+   if (count_msg_type[3]>0) {
+       sprintf(buff_tmp,"ACK(%d) ",count_msg_type[3]);
+       strcat(buff,buff_tmp);
+   }
+
+   if (count_msg_type[4]>0) {
+       sprintf(buff_tmp,"HEARTBEAT(%d) ",count_msg_type[4]);
+       strcat(buff,buff_tmp);
+   }
+
+   if (count_msg_type[5]>0) {
+       sprintf(buff_tmp,"GAP(%d) ",count_msg_type[5]);
+       strcat(buff,buff_tmp);
+   }
+
+   if (count_msg_type[6]>0) {
+       sprintf(buff_tmp,"INFO_TS(%d) ",count_msg_type[6]);
+       strcat(buff,buff_tmp);
+   }
+
+   if (count_msg_type[7]>0) {
+       sprintf(buff_tmp, "INFO_SRC(%d) ",count_msg_type[7]);
+       strcat(buff,buff_tmp);
+   }
+
+   if (count_msg_type[8]>0) {
+       sprintf(buff_tmp,"INFO_REPLY(%d) ",count_msg_type[8]);
+       strcat(buff,buff_tmp);
+   }
+
+   if (count_msg_type[9]>0) {
+       sprintf(buff_tmp,"INFO_DST(%d) ",count_msg_type[9]);
+       strcat(buff,buff_tmp);
+   }
+
+   if (count_msg_type[10]>0) {
+       sprintf(buff_tmp,"vendor specific(%d) ",count_msg_type[10]);
+       strcat(buff,buff_tmp);
+   }
+
+   col_add_fstr(pinfo->cinfo, COL_INFO, buff);
+
+  }
+
+
+  return TRUE;
+
+}  // end dissect_rtps(...)
+
+/* *********************************************************************** */
+
+
+/* *********************************************************************** *
+ *                                                                         *
+ *                        get 16 bit from the stream                       *
+ *                                                                         *
+ * *********************************************************************** */
+
+static guint16  get_guint16(tvbuff_t *tvb, gint offset, gint16 e_bit)
+{
+  guint16   value = tvb_get_ntohs(tvb, offset);
+  /* get_ntohs() automaticaly convert data to BIG ENDIAN */
+
+  /* WORDS_BIGENDIAN = machine endianing
+     e_bit = message endianing            */
+    #if WORDS_BIGENDIAN
+      if(!e_bit)      value = bswap_16(value);
+    #else
+      if( e_bit)      value = bswap_16(value);
+    #endif
+
+    return(value);
+}
+
+/* *********************************************************************** */
+
+
+/* *********************************************************************** *
+ *                                                                         *
+ *                          get 32 bit from the stream                     *
+ *                                                                         *
+ * *********************************************************************** */
+
+static guint32  get_guint32(tvbuff_t *tvb, gint offset, gint16 e_bit)
+{
+  guint32     value = tvb_get_ntohl(tvb, offset);
+  /* get_ntohl() automaticaly convert data to BIG ENDIAN */
+
+  /* WORDS_BIGENDIAN = machine endianing
+     e_bit = message endianing            */
+    #if WORDS_BIGENDIAN
+      if(!e_bit)    value  = bswap_32(value);
+    #else
+      if( e_bit)    value  = bswap_32(value);
+    #endif
+
+    return(value);
+}
+
+/* *********************************************************************** */
+
+
+/* *********************************************************************** *
+ *                                                                         *
+ *                               get Protocol version                      *
+ *                                                                         *
+ * *********************************************************************** */
+
+static char *
+protocol_version_to_string(gint offset,tvbuff_t *tvb,char *buff)
+{
+  guint8            major, minor;
+
+  /* protocol verzion = major.minor */
+   major = tvb_get_guint8(tvb, offset);
+   minor = tvb_get_guint8(tvb, (offset+1));
+
+   sprintf(buff,"%d.%d", major, minor);
+   return(buff);
+
+}
+
+/* *********************************************************************** */
+
+
+/* *********************************************************************** *
+ *                                                                         *
+ *                               get Vendor Id                             *
+ *                                                                         *
+ * *********************************************************************** */
+
+static char *
+vendor_id_to_string(gint offset, tvbuff_t *tvb, char *buff)
+{
+  guint8              major, minor;
+  VendorId            vendorId_rti;
+
+  VENDOR_ID_RTI(vendorId_rti);
+
+  major = tvb_get_guint8(tvb, offset);
+  minor = tvb_get_guint8(tvb, (offset+1));
+
+  if (major == vendorId_rti.major &&
+      minor == vendorId_rti.minor)
+  { sprintf(buff,"Real-Time Innovations,Inc.,CA,USA");
+    return(buff); }
+
+  sprintf(buff,"Vendor unknown");
+  return(buff);
+}
+
+/* *********************************************************************** */
+
+
+/* *********************************************************************** *
+ *                                                                         *
+ *                               get IP Address                            *
+ *                                                                         *
+ * *********************************************************************** */
+
+static char *
+IP_to_string(gint offset,tvbuff_t *tvb,gint16 e_bit,char buff[])
+{
+  IPAddress         ip;
+  guint8  a = 0, b = 0, c = 0, d = 0; /* IP Adress = a.b.c.d */
+
+  ip = get_guint32(tvb, offset, e_bit);
+     //get_guint32() - reads + endian conversion
+  a = (ip >> 24);
+  b = (ip >> 16) & 0xff;
+  c = (ip >>  8) & 0xff;
+  d =  ip & 0xff;
+
+  sprintf(buff,"%d.%d.%d.%d", a, b, c, d);
+  return(buff);
+}
+
+/* *********************************************************************** */
+
+
+/* *********************************************************************** *
+ *                                                                         *
+ *                               get Port                                  *
+ *                                                                         *
+ * *********************************************************************** */
+
+static char *
+port_to_string(gint offset,tvbuff_t *tvb,gint16 e_bit,char buff[])
+{
+  Port port = get_guint32(tvb, offset, e_bit);
+            //get_guint32() - reads + endian conversion
+
+  if (port == PORT_INVALID)
+    sprintf(buff,"PORT_INVALID");
+  else
+    sprintf(buff,"0x%X",port);
+
+  return(buff);
+}
+
+/* *********************************************************************** */
+
+
+/* *********************************************************************** *
+ *                                                                         *
+ *                                get NTP Time                             *
+ *                                                                         *
+ * *********************************************************************** */
+
+static char *
+get_NtpTime(gint offset,tvbuff_t *tvb,gint16 e_bit,char buff[])
+{
+  NtpTime         ntpTime;
+  float           time;
+
+  //get_guint32() - reads + endian conversion
+  ntpTime.seconds  =  get_guint32(tvb, offset, e_bit);
+  ntpTime.fraction =  get_guint32(tvb, (offset + 4), e_bit);
+  time = ntpTime.seconds + (ntpTime.fraction / 2^(32));
+
+  sprintf(buff,"%f", time);
+  return(buff);
+}
+
+/* *********************************************************************** */
+
+
+/* *********************************************************************** *
+ *                                                                         *
+ *                                get Host Id                              *
+ *                                                                         *
+ * *********************************************************************** */
+
+static char *
+host_id_to_string(gint offset,tvbuff_t *tvb, char buff[])
+{
+  guint32       hostId = tvb_get_ntohl(tvb, offset);
+  /* get_ntohl() automaticaly convert data to BIG ENDIAN */
+
+  sprintf(buff,"0x%X", hostId);
+  return(buff);
+}
+
+/* *********************************************************************** */
+
+
+/* *********************************************************************** *
+ *                                                                         *
+ *                                get AppID                                *
+ *                                                                         *
+ * *********************************************************************** */
+
+static char *
+app_id_to_string(gint offset,tvbuff_t *tvb,char buff[])
+{
+  guint32        appId = tvb_get_ntohl(tvb, offset);
+  /* get_ntohl() automaticaly convert data to BIG ENDIAN */
+
+  /* Instance Id */
+  guint32        instanceId = (appId >> 8);
+  /* applicatin Kind */
+  guint8         appKind    = (appId & 0xff);
+
+  if (appKind == MANAGEDAPPLICATION)
+  {
+    sprintf(buff,"Managed App, InstanceId: 0x%X",instanceId);
+    return(buff);
+  }
+
+  if (appKind == MANAGER)
+  {
+    sprintf(buff,"Manager, InstanceId: 0x%X",instanceId);
+    return(buff);
+  }
+
+  sprintf(buff,"Unknown");
+  return(buff);
+
+}
+
+/* *********************************************************************** */
+
+
+/* *********************************************************************** *
+ *                                                                         *
+ *                         get Object_Id (32 bit)                          *
+ *                                                                         *
+ * *********************************************************************** */
+
+static char *
+object_id_to_string(gint offset, tvbuff_t *tvb, char buff[])
+{
+  guint32        objectId = tvb_get_ntohl(tvb, offset);
+  /* get_ntohl() automaticaly convert data to BIG ENDIAN */
+
+  if (objectId == OID_UNKNOWN)      { sprintf(buff,"Unknown ObjectId");
+                                      return(buff);}
+  if (objectId == OID_APP)          { sprintf(buff,"applicationSelf");
+                                      return(buff);}
+  if (objectId == OID_WRITE_APPSELF){ sprintf(buff,"writerApplicationSelf");
+                                      return(buff);}
+  if (objectId == OID_WRITE_APP)    { sprintf(buff,"writerApplications");
+                                      return(buff);}
+  if (objectId == OID_READ_APP)     { sprintf(buff,"readerApplications");
+                                      return(buff);}
+  if (objectId == OID_WRITE_MGR)    { sprintf(buff,"writerManagers");
+                                      return(buff);}
+  if (objectId == OID_READ_MGR)     { sprintf(buff,"readerManagers ");
+                                      return(buff);}
+  if (objectId == OID_WRITE_PUBL)   { sprintf(buff,"writerPublications");
+                                      return(buff);}
+  if (objectId == OID_READ_PUBL)    { sprintf(buff,"readerPublications");
+                                      return(buff);}
+  if (objectId == OID_WRITE_SUBS)   { sprintf(buff,"writerSubscriptions");
+                                      return(buff);}
+  if (objectId == OID_READ_SUBS)    { sprintf(buff,"readerSubscriptions");
+                                      return(buff);}
+
+  // nothing from the possibilites above
+  sprintf(buff,"instanceId: 0x%X, objKind: 0x%X",
+               (objectId >> 8),(objectId & 0xff));
+  return(buff);
+
+/* for the future
+//Kind
+#define OID_APPLICATION      0x01
+#define OID_CSTWRITER        0x02
+#define OID_PUBLICATION      0x03
+#define OID_SUBSCRIPTION     0x04
+#define OID_CSTREADER        0x07
+//
+#define OID_USEROBJ          0x00
+#define OID_RESUSEROBJ       0x40
+#define OID_METAOBJ          0x80
+#define OID_RESMETAOBJ       0xC0
+*/
+}
+
+/* *********************************************************************** */
+
+
+/* *********************************************************************** *
+ *                                                                         *
+ *                      get Sequence Number (64 bit)                       *
+ *                                                                         *
+ * *********************************************************************** */
+
+static gint
+seq_nr_to_string(gint offset, gint16 e_bit, tvbuff_t *tvb,
+                 SequenceNumber *p_seqNumber)
+{
+   /* get_ntohl() automaticaly convert data to BIG ENDIAN */
+   p_seqNumber->high = tvb_get_ntohl(tvb, offset);
+   offset += 4;
+
+   p_seqNumber->low  = tvb_get_ntohl(tvb, offset);
+
+
+  /* WORDS_BIGENDIAN = machine endianing
+     e_bit = message endianing            */
+   #if WORDS_BIGENDIAN
+     if(!e_bit)  { p_seqNumber->high = bswap_32(p_seqNumber->high);
+                   p_seqNumber->low  = bswap_32(p_seqNumber->low);  }
+   #else
+     if( e_bit)  { p_seqNumber->high = bswap_32(p_seqNumber->high);
+                   p_seqNumber->low  = bswap_32(p_seqNumber->low);  }
+   #endif
+
+   return(1);
+}
+
+/* *********************************************************************** */
+
+
+/* *********************************************************************** *
+ *                                                                         *
+ *                                get_Bitmap                               *
+ *                                                                         *
+ * *********************************************************************** */
+
+static void
+get_bitmap(tvbuff_t *tvb, gint *p_offset, gint16 e_bit, guint16 next_submsg,
+           proto_tree *tree)
+{
+  proto_item             *ti;
+  proto_tree             *rtps_bitmap_tree;
+  gint                    i = 0;
+  gint                    offset = *p_offset;
+  guint32                 bitmap = 0x0;
+  SequenceNumber          sequenceNumber;
+
+  /* making subtree for the bitmap */
+  ti = proto_tree_add_text(tree,tvb,offset,(next_submsg-offset),"Bitmap");
+  rtps_bitmap_tree = proto_item_add_subtree(ti, ett_rtps_bitmap);
+
+   /* SekvenceNumber bitmapBase */
+   seq_nr_to_string(offset, e_bit, tvb, &sequenceNumber);
+   proto_tree_add_text(rtps_bitmap_tree, tvb, offset, 8,
+                       "bitmapBase:  0x%X%X",
+                       sequenceNumber.high, sequenceNumber.low);
+   offset +=8;
+
+   proto_tree_add_text(rtps_bitmap_tree, tvb, offset, 4,
+                       "numBits:     0x%X",
+                       get_guint32(tvb, offset, e_bit));
+   offset += 4;
+
+   while (offset < (next_submsg -1))
+   {
+      proto_tree_add_text(rtps_bitmap_tree, tvb, offset, 4,
+                          "bitmap[%d]:   0x%08X",
+                          i, get_guint32(tvb, offset, e_bit));
+      offset +=4;
+      ++i;
+   }  /* end while */
+
+   *p_offset = offset;
+}
+
+/* *********************************************************************** */
+
+
+/* *********************************************************************** *
+ *                                                                         *
+ *                          dissect submessage: PAD                        *
+ *                                                                         *
+ *           (this submessage has no meaning and it is always valid)       *
+ * *********************************************************************** */
+
+static void
+dissect_PAD(tvbuff_t *tvb, gint offset,  proto_tree *tree)
+{
+  proto_item             *ti;
+  proto_tree             *rtps_submessage_tree;
+  gint                    flags = 0;
+
+  ti = proto_tree_add_text(tree, tvb, offset, 1,"Submessage Id: PAD");
+  rtps_submessage_tree = proto_item_add_subtree(ti, ett_rtps_submessage);
+  offset += 1;
+
+  /* -- if you want to see 'flags' in window - just uncomment -- */
+  /*
+  proto_tree_add_item(rtps_submessage_tree, hf_rtps_submessage_flags,
+                      tvb, offset, 1, FALSE);
+  */
+
+  flags = tvb_get_guint8(tvb, offset);
+
+  /*  E flag |XXXX|HAPE| => masks with 000000001b = 1  */
+  if ((flags & FLAG_E) != 0)      e_bit = LITTLE_ENDIAN;
+    else                          e_bit = BIG_ENDIAN;
+
+  offset += 1;
+
+  /* --if you want to see'Octets to Next Header'in window - uncomment -- */
+  /*
+  proto_tree_add_item(rtps_submessage_tree,hf_rtps_octets_to_next_header,
+                      tvb, offset+2, 2, TRUE);
+  */
+
+}
+
+/* *********************************************************************** */
+
+
+/* *********************************************************************** *
+ *                                                                         *
+ *                          dissect submessage: VAR                        *
+ *                                                                         *
+ * *********************************************************************** */
+
+static void
+dissect_VAR(tvbuff_t *tvb, gint offset,  proto_tree *tree)
+{
+   proto_item        *ti;
+   proto_tree        *rtps_submessage_tree;
+   gint               flags = 0;
+   gint               next_submsg_offset = 0;
+   char               buff[200];
+   SequenceNumber     writerSeqNumber;
+   guint16            parameter;       /* sekvence parameter */
+   guint16            param_length;    /* length of sekvence parameter */
+
+   ti =  proto_tree_add_text(tree, tvb, offset, 1, "Submessage Id: VAR ");
+   rtps_submessage_tree = proto_item_add_subtree(ti, ett_rtps_submessage);
+   offset += 1;
+
+
+   flags = tvb_get_guint8(tvb, offset);
+  /* -- if you want to see flags in window - just uncomment -- */
+  /*
+   proto_tree_add_item(rtps_submessage_tree, hf_rtps_submessage_flags,
+                       tvb, offset, 1, FALSE);
+  */
+
+   offset +=1;
+
+  /* E flag |XXXX|HAPE| => masks with 000000001b = 1 */
+   if ((flags & FLAG_E) != 0)   e_bit = LITTLE_ENDIAN;
+     else                       e_bit = BIG_ENDIAN;
+
+
+   next_submsg_offset = offset + 2 + get_guint16(tvb, offset, e_bit);
+  /* actual offset + long of the octetsToNextHeader =
+   *  =  2 Bytes + octetsToNextHeader */
+
+
+  /* -- if you want to see Offset to Next Header - just uncomment -- */
+  /*
+   proto_tree_add_text(rtps_submessage_tree, tvb, offset, 2,
+                       "Octets_to_next_header + offset (NEW): 0x%X",
+                        next_submsg_offset);
+  */
+  offset +=2;
+
+  /*  readerObjectId*/
+   proto_tree_add_text(rtps_submessage_tree, tvb, offset, 4,
+                       "Reader Object ID:   %s ",
+                        object_id_to_string(offset, tvb, buff));
+   offset +=4;
+
+   /*  writerObjectId*/
+    proto_tree_add_text(rtps_submessage_tree, tvb, offset, 4,
+                        "Writer Object ID:   %s ",
+                        object_id_to_string(offset, tvb, buff));
+    offset+=4;
+
+   /*  H flag |XXXX|HAPE| => masks with 00001000b = 8 */
+    if ((flags & FLAG_H) != 0)
+     {
+      /*  HostId */
+       proto_tree_add_text(rtps_submessage_tree, tvb, offset, 4,
+                           "Host ID:            %s",
+                           host_id_to_string(offset,tvb,buff));
+       offset+=4;
+
+      /*  App Id  */
+       proto_tree_add_text(rtps_submessage_tree, tvb, offset, 4,
+                           "App ID:             %s",
+                            app_id_to_string(offset, tvb, buff));
+       offset +=4;
+     }
+
+    /* Object Id */
+     proto_tree_add_text(rtps_submessage_tree, tvb, offset, 4,
+                         "Object ID:          %s ",
+                         object_id_to_string(offset, tvb, buff));
+     offset +=4;
+
+    /*  WriterSequence Number */
+     seq_nr_to_string(offset, e_bit, tvb, &writerSeqNumber);
+     proto_tree_add_text(rtps_submessage_tree, tvb, offset, 8,
+                         "WriterSeqNumber:    0x%X%X",
+                         writerSeqNumber.high, writerSeqNumber.low);
+     offset +=8;
+
+
+   /*  P flag |XXXX|HAPE| => masks with 00000010b = 2 */
+    if ((flags & FLAG_P) != 0)
+    {
+      proto_tree_add_text(rtps_submessage_tree, tvb, offset,
+                          (next_submsg_offset - offset),
+                          "Parameters:");
+     do
+     {
+       parameter    = get_guint16(tvb, offset, e_bit);  offset +=2;
+       param_length = get_guint16(tvb, offset, e_bit);  offset +=2;
+
+       proto_tree_add_text(rtps_submessage_tree, tvb,offset, param_length,
+                           "%s", get_parameter(offset, tvb, e_bit, buff,
+                                               parameter,param_length));
+       offset += param_length;
+
+     }  while (offset < (next_submsg_offset -1));
+
+    }  // end if
+
+
+}
+
+/* *********************************************************************** */
+
+
+/* *********************************************************************** *
+ *                                                                         *
+ *                                get_Parameter                            *
+ *                                                                         *
+ * *********************************************************************** */
+
+static char *
+get_parameter(gint offset, tvbuff_t *tvb, gint16 e_bit, char buff[],
+              guint16 parameter, guint16 param_length)
+{
+  char              buff_tmp[MAX_PATHNAME];
+  int               i;
+
+  SequenceNumber    seqNumber;
+
+  switch (parameter)
+  {
+    case PID_PAD:
+    {
+      sprintf(buff," PARAM_PID_PAD: -");
+      return(buff);
+    }
+
+    case PID_SENTINEL:
+    {
+      sprintf(buff," PARAM_PID_SENTINEL: -");
+      return(buff);
+    }
+
+    case PID_EXPIRATION_TIME:
+    {
+      sprintf(buff," PID_EXPIRATION_TIME: %s",
+              get_NtpTime(offset, tvb, e_bit,buff_tmp));
+      return(buff);
+    }
+
+    case PID_PERSISTENCE:
+    {
+      sprintf(buff," PID_PERSISTENCE: %s",
+              get_NtpTime(offset, tvb, e_bit,buff_tmp));
+      return(buff);
+    }
+
+   case PID_MINIMUM_SEPARATION:
+   {
+      sprintf(buff," PID_MINIMUM_SEPARATION: %s",
+              get_NtpTime(offset, tvb, e_bit,buff_tmp));
+      return(buff);
+   }
+
+   case PID_TOPIC: //--- ?? funguje spravne ??
+   {
+     for (i = 0; i < param_length; i++)
+     {
+       buff_tmp[i] = tvb_get_guint8(tvb,offset);
+       offset++;
+     }
+
+     sprintf(buff," PID_TOPIC: ");
+     strcat(buff,buff_tmp);
+     return(buff);
+   }
+
+   case PID_STRENGTH:
+   {
+     sprintf(buff," PID_STRENGTH: 0x%X",
+             get_guint32(tvb, offset, e_bit));
+     return(buff);
+   }
+
+   case PID_TYPE_NAME: //--- ?? funguje spravne ??
+   {
+     for (i = 0; i < param_length; i++)
+     {
+       buff_tmp[i] = tvb_get_guint8(tvb,offset);
+       offset++;
+     }
+     sprintf(buff," PID_TYPE_NAME:");
+     strcat(buff,buff_tmp);
+     return(buff);
+   }
+
+   case PID_TYPE_CHECKSUM:
+   {
+     // nacitam jako UNSIGNED - nemuze to byt i zaporne cislo??
+     sprintf(buff," PID_TYPE_CHECKSUM: 0x%X",
+             get_guint32(tvb, offset, e_bit));
+     return(buff);
+   }
+
+   case RTPS_PID_TYPE2_NAME:
+   {
+     sprintf(buff," RTPS_PID_TYPE2_NAME:"); return(buff);
+   }
+
+   case RTPS_PID_TYPE2_CHECKSUM:
+   {
+     sprintf(buff," RTPS_PID_TYPE2_CHECKSUM:"); return(buff);
+   }
+
+   case PID_METATRAFFIC_MULTICAST_IPADDRESS:
+   {
+      sprintf(buff," PID_METATRAFFIC_MULTICAST_IPADDRESS: %s",
+              IP_to_string(offset, tvb, e_bit,buff_tmp));
+      return(buff);
+   }
+
+   case PID_APP_IPADDRESS:
+   {
+      sprintf(buff," PID_APP_IPADDRESS: %s",
+              IP_to_string(offset, tvb, e_bit,buff_tmp));
+      return(buff);
+   }
+
+   case PID_METATRAFFIC_UNICAST_PORT:
+   {
+      sprintf(buff," PID_METATRAFFIC_UNICAST_PORT: %s",
+              port_to_string(offset, tvb, e_bit,buff_tmp));
+      return(buff);
+   }
+
+   case PID_USERDATA_UNICAST_PORT:
+   {
+      sprintf(buff," PID_USERDATA_UNICAST_PORT: %s",
+              port_to_string(offset, tvb, e_bit,buff_tmp));
+      return(buff);
+   }
+
+   case PID_EXPECTS_ACK:
+   {
+      if (tvb_get_guint8(tvb, offset) == 0)
+      { sprintf(buff," PID_EXPECTS_ACK: No"); return(buff); }
+      else
+      { sprintf(buff," PID_EXPECTS_ACK: Yes"); return(buff); }
+   }
+
+   case PID_USERDATA_MULTICAST_IPADDRESS:
+   {
+      sprintf(buff," PID_USERDATA_MULTICAST_IPADDRESS: %s",
+              IP_to_string(offset, tvb, e_bit,buff_tmp));
+      return(buff);
+   }
+
+   case PID_MANAGER_KEY:
+   {
+      sprintf(buff," PID_STRENGTH: 0x%X",
+              get_guint32(tvb, offset, e_bit));
+      return(buff);
+   }
+
+   case PID_SEND_QUEUE_SIZE:
+   {
+      sprintf(buff," PID_SEND_QUEUE_SIZE: 0x%X",
+              get_guint32(tvb, offset, e_bit));
+      return(buff);
+   }
+
+   case PID_PROTOCOL_VERSION:
+   {
+      sprintf(buff," PID_PROTOCOL_VERSION: %s",
+              protocol_version_to_string(offset, tvb, buff_tmp));
+      return(buff);
+   }
+
+   case PID_VENDOR_ID:
+   {
+      sprintf(buff," PID_VENDOR_ID: %s",
+              vendor_id_to_string(offset, tvb, buff_tmp));
+      return(buff);
+   }
+
+   case PID_VARGAPPS_SEQUENCE_NUMBER_LAST:
+   {
+     seq_nr_to_string(offset, e_bit, tvb, &seqNumber);
+     sprintf(buff," PID_VARGAPPS_SEQUENCE_NUMBER_LAST: 0x%X%X",
+             seqNumber.high, seqNumber.low);
+     return(buff);
+   }
+
+   case PID_RECV_QUEUE_SIZE:
+   {
+      sprintf(buff," PID_RECV_QUEUE_SIZE: 0x%X",
+              get_guint32(tvb, offset, e_bit));
+      return(buff);
+   }
+
+  case PID_RELIABILITY_OFFERED:
+  {
+     sprintf(buff," PID_RELIABILITY_OFFERED: 0x%X",
+             get_guint32(tvb, offset, e_bit));
+     return(buff);
+  }
+
+  case PID_RELIABILITY_REQUESTED:
+  {
+     sprintf(buff," PID_RELIABILITY_REQUESTED: 0x%X",
+             get_guint32(tvb, offset, e_bit));
+     return(buff);
+  }
+
+  default:
+  {
+     sprintf(buff," :!: Unknown sekvence parameter");
+     return(buff);
+  }
+ }   // end switch
+
+}
+
+/* *********************************************************************** */
+
+
+/* *********************************************************************** *
+ *                                                                         *
+ *                  subdissector for submessage: ISSUE                     *
+ *                                                                         *
+ * *********************************************************************** */
+ /* hotovo 12.01.04 - JEN OTESTOVAT :] */
+static void
+dissect_ISSUE(tvbuff_t *tvb, gint offset,  proto_tree *tree)
+{
+  proto_item               *ti;
+  proto_tree               *rtps_submessage_tree;
+  gint                      flags = 0;
+  gint                      next_submsg_offset = 0;
+  char                      buff[40];
+  SequenceNumber            sequenceNumber;      /*  type struct  */
+
+  ti = proto_tree_add_text(tree, tvb, offset,1,"Submessage Id: ISSUE");
+  rtps_submessage_tree = proto_item_add_subtree(ti, ett_rtps_submessage);
+  offset +=1;
+
+  flags = tvb_get_guint8(tvb, offset);
+
+  /* -- if you want to see flags in window - just uncomment -- */
+  /*
+  proto_tree_add_item(rtps_submessage_tree, hf_rtps_submessage_flags,
+                      tvb, offset, 1, FALSE);
+  */
+  offset +=1;
+
+  /* E flag |XXXX|HAPE| => masks with 000000001b = 1 */
+  if ((flags & FLAG_E) != 0)        e_bit = LITTLE_ENDIAN;
+    else                            e_bit = BIG_ENDIAN;
+
+  next_submsg_offset = offset + 2 + get_guint16(tvb, offset, e_bit);
+  /* next_submsg_offset = actual offset + long of the octetsToNextHeader
+   *                      + octetsToNextHeader                       */
+
+  /* -- if you want to see Offset to Next Header - just uncomment -- */
+  /*
+  proto_tree_add_text(rtps_submessage_tree, tvb, offset, 2,
+                      "Octets_to_next_header + offset (NEW): 0x%X",
+                      next_submsg_offset);
+  */
+  offset +=2;
+
+  /*  Reader Object ID  */
+  proto_tree_add_text(rtps_submessage_tree, tvb, offset, 4,
+                      "Reader Object ID: %s ",
+                      object_id_to_string(offset, tvb, buff));
+  offset +=4;
+
+  /*  Writer Object ID */
+  proto_tree_add_text(rtps_submessage_tree, tvb, offset, 4,
+                      "Writer Object ID: %s ",
+                      object_id_to_string(offset, tvb, buff));
+  offset +=4;
+
+  /*  Sequence Number */
+  seq_nr_to_string(offset, e_bit, tvb, &sequenceNumber);
+  proto_tree_add_text(rtps_submessage_tree, tvb, offset, 8,
+                      "firstSeqNumber:   0x%X%X",
+                      sequenceNumber.high, sequenceNumber.low);
+  offset += 8;
+
+  /*  Parameters */
+/* *********************************************************************** *
+ * 'Parameters' - are saved in 64bites so I dissect it like a              *
+ *                'Sequence Number'                                        *
+ *              - for future extension of the protocol - in                *
+ *                implementation of RTPS 1.0 can ignore the content        *
+ * *********************************************************************** */
+
+  /* -- P flag |XXXX|HAPE| => masks with 00000010b = 2 */
+  if ((flags & FLAG_P) != 0)
+  {
+    seq_nr_to_string(offset, e_bit, tvb, &sequenceNumber);
+    proto_tree_add_text(rtps_submessage_tree, tvb, offset, 8,
+                        "Parameters:   0x%X%X",
+                        sequenceNumber.high, sequenceNumber.low);
+    offset += 8;
+  }
+
+  /*  Issue Data */
+  proto_tree_add_item(rtps_submessage_tree, hf_rtps_issue_data, tvb,
+                      offset, (next_submsg_offset - offset), FALSE);
+
+}
+
+/* *********************************************************************** */
+
+
+/* *********************************************************************** *
+ *                                                                         *
+ *                  subdissector for submessage: ACK                       *
+ *                                                                         *
+ * *********************************************************************** */
+ /* hotovo 12.01.04 - JEN OTESTOVAT :] */
+static void
+dissect_ACK(tvbuff_t *tvb, gint offset,  proto_tree *tree)
+{
+  proto_item             *ti;
+  proto_tree             *rtps_submessage_tree;
+  gint                    flags = 0;
+  gint                    next_submsg_offset = 0;
+  char                    buff[40];
+
+  ti = proto_tree_add_text(tree, tvb, offset, 1,"Submessage Id: ACK");
+  rtps_submessage_tree = proto_item_add_subtree(ti, ett_rtps_submessage);
+  offset +=1;
+
+  flags = tvb_get_guint8(tvb, offset);
+  /* -- if you want to see flags in window - just uncomment -- */
+  /*
+  proto_tree_add_item(rtps_submessage_tree, hf_rtps_submessage_flags,
+                      tvb, offset, 1, FALSE);
+  */
+  offset +=1;
+
+  /* E flag |XXXX|HAPE| => masks with 000000001b = 1 */
+  if ((flags & FLAG_E) != 0)      e_bit = LITTLE_ENDIAN;
+   else                           e_bit = BIG_ENDIAN;
+
+  next_submsg_offset = offset + 2 + get_guint16(tvb, offset, e_bit);
+  /* next_submsg_offset = actual offset + long of the octetsToNextHeader
+   *                      + octetsToNextHeader                       */
+
+  /* -- if you want to see Offset to Next Header - just uncomment -- */
+  /*
+  proto_tree_add_text(rtps_submessage_tree, tvb, offset, 2,
+                      "Octets_to_next_header + offset (NEW): 0x%X",
+                      next_submsg_offset);
+  */
+  offset +=2;
+
+  /*  Reader Object ID  */
+  proto_tree_add_text(rtps_submessage_tree, tvb, offset, 4,
+                      "Reader Object ID:   %s ",
+                      object_id_to_string(offset, tvb, buff));
+  offset +=4;
+
+  /*  Writer Object ID  */
+  proto_tree_add_text(rtps_submessage_tree, tvb, offset, 4,
+                      "Writer Object ID:   %s ",
+                      object_id_to_string(offset, tvb, buff));
+  offset +=4;
+
+  get_bitmap(tvb,&offset,e_bit,next_submsg_offset,rtps_submessage_tree);
+
+}
+
+/* *********************************************************************** */
+
+
+/* *********************************************************************** *
+ *                                                                         *
+ *                subdissector for submessage: HEARTBEAT                   *
+ *                                                                         *
+ * *********************************************************************** */
+ /* hotovo 12.01.04 - JEN OTESTOVAT :] */
+static void
+dissect_HEARTBEAT(tvbuff_t *tvb, gint offset, proto_tree *tree)
+{
+  proto_item         *ti;
+  proto_tree         *rtps_submessage_tree;
+  guint8              flags = 0;
+  char                buff[40];
+  SequenceNumber     sequenceNumber;      /* type struct  */
+
+  ti = proto_tree_add_text(tree, tvb, offset,1,"Submessage Id: HEARTBEAT");
+  rtps_submessage_tree = proto_item_add_subtree(ti, ett_rtps_submessage);
+  offset +=1;
+
+  /* -- if you want to see Submessage's Flags - just uncomment */
+  /* proto_tree_add_item(rtps_submessage_tree, hf_rtps_submessage_flags,
+                         tvb, offset, 1, FALSE); */
+  flags = tvb_get_guint8(tvb, offset);
+  offset +=1;
+
+  /*  E flag |XXXX|HAPE| => masks with 000000001b = 1  */
+  if ((flags & FLAG_E) != 0)      e_bit = LITTLE_ENDIAN;
+   else                           e_bit = BIG_ENDIAN;
+
+  /* -- if you want to see Offset to Next Header - just uncomment -- */
+  /*
+  proto_tree_add_text(rtps_submessage_tree, tvb, offset, 1,
+                      "Octets_to_next_header: 0x%X",
+                      get_guint16(tvb, offset, e_bit));
+  */
+  offset +=2;
+  /* Reader Object ID */
+  proto_tree_add_text(rtps_submessage_tree, tvb, offset, 4,
+                      "Reader Object ID:   %s ",
+                      object_id_to_string(offset, tvb, buff));
+  offset +=4;
+
+  /* Writer Object ID */
+  proto_tree_add_text(rtps_submessage_tree, tvb, offset, 4,
+                      "Writer Object ID:   %s ",
+                          object_id_to_string(offset, tvb, buff));
+  offset +=4;
+
+  /*  firstSeqNumber */
+  seq_nr_to_string(offset, e_bit, tvb, &sequenceNumber);
+  proto_tree_add_text(rtps_submessage_tree, tvb, offset, 8,
+                      "firstSeqNumber:     0x%X%X",
+                      sequenceNumber.high, sequenceNumber.low);
+  offset +=8;
+
+  /* lastSeqNumber */
+  seq_nr_to_string(offset, e_bit, tvb, &sequenceNumber);
+  proto_tree_add_text(rtps_submessage_tree, tvb, offset, 8,
+                      "lastSeqNumber:      0x%X%X",
+                      sequenceNumber.high, sequenceNumber.low);
+  offset +=8;
+
+}
+
+/* *********************************************************************** */
+
+
+/* *********************************************************************** *
+ *                                                                         *
+ *                   subdissector for submessage: GAP                      *
+ *                                                                         *
+ * *********************************************************************** */
+ /* hotovo 12.01.04 - JEN OTESTOVAT :] */
+static void
+dissect_GAP(tvbuff_t *tvb, gint offset, proto_tree *tree)
+{
+  proto_item             *ti;
+  proto_tree             *rtps_submessage_tree;
+  gint                    flags = 0;
+  gint                    next_submsg_offset = 0;
+  char                    buff[40];
+  SequenceNumber          sequenceNumber;      /* type struct  */
+
+  ti = proto_tree_add_text(tree, tvb, offset, 1,"Submessage Id: GAP");
+  rtps_submessage_tree = proto_item_add_subtree(ti, ett_rtps_submessage);
+  offset +=1;
+
+  flags = tvb_get_guint8(tvb, offset);
+  /* -- if you want to see flags in window - just uncomment -- */
+  /*
+  proto_tree_add_item(rtps_submessage_tree, hf_rtps_submessage_flags,
+                      tvb, offset, 1, FALSE);
+  */
+  offset +=1;
+
+  /* E flag |XXXX|HAPE| => masks with 000000001b = 1 */
+  if ((flags & FLAG_E) != 0)      e_bit = LITTLE_ENDIAN;
+    else                          e_bit = BIG_ENDIAN;
+
+  next_submsg_offset = offset + 2 + get_guint16(tvb, offset, e_bit);
+  /* next_submsg_offset = actual offset + long of the octetsToNextHeader
+   *                      + octetsToNextHeader                       */
+
+  /* -- if you want to see Offset to Next Header - just uncomment -- */
+  /*
+  proto_tree_add_text(rtps_submessage_tree, tvb, offset, 2,
+                      "Octets_to_next_header + offset (NEW): 0x%X",
+                      next_submsg_offset);
+  */
+  offset +=2;
+
+  /*  Reader Object ID  */
+  proto_tree_add_text(rtps_submessage_tree, tvb, offset, 4,
+                      "Reader Object ID:          %s ",
+                      object_id_to_string(offset, tvb, buff));
+  offset +=4;
+
+  /*  Writer Object ID  */
+  proto_tree_add_text(rtps_submessage_tree, tvb, offset, 4,
+                      "Writer Object ID:          %s ",
+                      object_id_to_string(offset, tvb, buff));
+  offset +=4;
+
+  /*  Sequence Number */
+  seq_nr_to_string(offset, e_bit, tvb, &sequenceNumber);
+  proto_tree_add_text(rtps_submessage_tree, tvb, offset, 8,
+                      "firstSeqNumber:   0x%X%X",
+                      sequenceNumber.high, sequenceNumber.low);
+  offset +=8;
+
+  get_bitmap(tvb,&offset,e_bit,next_submsg_offset,rtps_submessage_tree);
+
+}
+
+/* *********************************************************************** */
+
+
+/* *********************************************************************** *
+ *                                                                         *
+ *                subdissector for submessage: INFO_TS                     *
+ *                                                                         *
+ * *********************************************************************** */
+ /* hotovo 12.01.04 - JEN OTESTOVAT :] */
+
+static void
+dissect_INFO_TS(tvbuff_t *tvb, gint offset, proto_tree *tree)
+{
+  proto_item              *ti;
+  proto_tree              *rtps_submessage_tree;
+  gint                     flags = 0;
+  char                     buff[10];
+
+  ti = proto_tree_add_text(tree, tvb, offset,1,"Submessage Id: INFO_TS");
+  rtps_submessage_tree = proto_item_add_subtree(ti, ett_rtps_submessage);
+  offset +=1;
+
+  flags = tvb_get_guint8(tvb, offset);
+  /*  Flags -- if you want to see - just uncomment -- */  /*
+  proto_tree_add_item(rtps_submessage_tree, hf_rtps_submessage_flags,
+                      tvb, offset, 1, FALSE);
+  */
+  offset +=1;
+
+  /*  E flag |XXXX|HAPE| => masks with 000000001b = 1 */
+  if ((flags & FLAG_E) != 0)      e_bit = LITTLE_ENDIAN;
+   else                           e_bit = BIG_ENDIAN;
+
+  /*  Offset to Next Header -- if you want to see - just uncomment */
+  /*
+  proto_tree_add_text(rtps_submessage_tree, tvb, offset, 2,
+                      "Octets_to_next_header + offset (NEW): 0x%X",
+                      next_submsg_offset);
+  */
+  offset +=2;
+
+  /*   npTimestamp - valid if flag I = 1         *
+   *   |XXXX|XXIE| => masks with 00000010b = 2   */
+  if ((flags & FLAG_I) != 0)
+  {
+    proto_tree_add_text(rtps_submessage_tree, tvb, offset, 8,
+                        "ntpTimestamp: %s (sec)",
+                        get_NtpTime(offset, tvb, e_bit,buff));
+    offset +=8;
+  }
+
+}
+
+/* *********************************************************************** */
+
+
+/* *********************************************************************** *
+ *                                                                         *
+ *               subdissector for submessage: INFO_SRC                     *
+ *                                                                         *
+ * *********************************************************************** */
+/* hotovo 12.01.04 JEN OTESTOVAT :] */
+static void
+dissect_INFO_SRC(tvbuff_t *tvb, gint offset,  proto_tree *tree)
+{
+  proto_item             *ti;
+  proto_tree             *rtps_submessage_tree;
+  gint                    flags = 0;
+  char                    buff[200];
+
+
+  ti = proto_tree_add_text(tree,tvb,offset,1,"Submessage Id: INFO_SRC");
+  rtps_submessage_tree = proto_item_add_subtree(ti, ett_rtps_submessage);
+  offset +=1;
+
+  flags = tvb_get_guint8(tvb, offset);
+
+  /*  Flags -- if you want to see - just uncomment -- */
+  /*
+  proto_tree_add_item(rtps_submessage_tree, hf_rtps_submessage_flags,
+                      tvb, offset, 1, FALSE);
+  */
+  offset +=1;
+
+  /*  E flag |XXXX|HAPE| => masks with 000000001b = 1 */
+  if ((flags & FLAG_E) != 0)      e_bit = LITTLE_ENDIAN;
+   else                           e_bit = BIG_ENDIAN;
+
+  /*  Offset to Next Header -- if you want to see - just uncomment */
+  /*
+  proto_tree_add_text(rtps_submessage_tree, tvb, offset, 2,
+                      "Octets_to_next_header + offset (NEW): 0x%X",
+                      next_submsg_offset);
+  */
+  offset +=2;
+
+  /*  IPAddress */
+  proto_tree_add_text(rtps_submessage_tree, tvb, offset, 4,
+                      "appIP address: %s",
+                      IP_to_string(offset, tvb, e_bit,buff));
+  offset +=4;
+
+  /*  Protocol Version */
+  proto_tree_add_text(rtps_submessage_tree, tvb, offset, 2,
+                      "Protocol  RTPS  version %s -new",
+                      protocol_version_to_string(offset, tvb, buff));
+  offset +=2;
+
+  /*  Vendor Id */
+  proto_tree_add_text(rtps_submessage_tree, tvb, offset, 2,
+                      "VendorId: %s -new",
+                      vendor_id_to_string(offset, tvb, buff));
+  offset +=2;
+
+  /*  Host Id */
+  proto_tree_add_text(rtps_submessage_tree, tvb, offset, 4,
+                      "Host ID:            %s",
+                      host_id_to_string(offset,tvb,buff));
+  offset+=4;
+
+  /*  App Id */
+  proto_tree_add_text(rtps_submessage_tree, tvb, offset, 4,
+                      "App ID:             %s-new",
+                      app_id_to_string(offset, tvb, buff));
+  offset +=4;
+
+}
+
+/* *********************************************************************** */
+
+
+/* *********************************************************************** *
+ *                                                                         *
+ *               subdissector for submessage: INFO_REPLY                   *
+ *                                                                         *
+ * *********************************************************************** */
+ /* hotovo 11.01.04 :] */
+static void
+dissect_INFO_REPLY(tvbuff_t *tvb, gint offset, proto_tree *tree)
+{
+  proto_item             *ti;
+  proto_tree             *rtps_submessage_tree;
+  gint                    flags = 0;
+  char                    buff_ip[10], buff_port[10];
+
+  ti = proto_tree_add_text(tree,tvb,offset,1,"Submessage Id: INFO_REPLY");
+  rtps_submessage_tree = proto_item_add_subtree(ti, ett_rtps_submessage);
+  offset +=1;
+
+  flags = tvb_get_guint8(tvb, offset);
+
+  /*  Flags -- if you want to see - just uncomment -- */
+  /*
+  proto_tree_add_item(rtps_submessage_tree, hf_rtps_submessage_flags,
+                      tvb, offset, 1, FALSE);
+  */
+  offset +=1;
+
+  /*  E flag |XXXX|HAPE| => masks with 000000001b = 1 */
+  if ((flags & FLAG_E) != 0)    e_bit = LITTLE_ENDIAN;
+   else                         e_bit = BIG_ENDIAN;
+
+  /*  Offset to Next Header -- if you want to see - just uncomment */
+  /*
+  proto_tree_add_text(rtps_submessage_tree, tvb, offset, 2,
+                      "Octets_to_next_header + offset (NEW): 0x%X",
+                      next_submsg_offset);
+  */
+  offset +=2;
+
+  /* Unicat Reply IPAddress */
+  proto_tree_add_text(rtps_submessage_tree, tvb, offset, 4,
+                      "Unicast Reply IP Adress: %s",
+                      IP_to_string(offset, tvb, e_bit,buff_ip));
+  offset +=4;
+
+
+  /* Unicast Reply Port */
+  proto_tree_add_text(rtps_submessage_tree, tvb, offset, 4,
+                      "Unicast Reply IP Port: %s",
+                      port_to_string(offset, tvb, e_bit,buff_port));
+  offset +=4;
+
+
+ /*  'multicastReplayAdress' and 'multicastReplayPort'are   *
+  *   parts of submessage INFO REPLAY which are available   *
+  *   only when FLAG  M=1  flags: XXXX XXME                 */
+
+  if ((flags & FLAG_M) != 0)
+  {
+    /* Multicast Reply IPAddress */
+    proto_tree_add_text(rtps_submessage_tree, tvb, offset, 4,
+                        "Multicast Reply IP Adress: %s",
+                        IP_to_string(offset, tvb, e_bit,buff_ip));
+    offset +=4;
+
+    /* Multicast Reply Port */
+    proto_tree_add_text(rtps_submessage_tree, tvb, offset, 4,
+                        "Multicast Reply IP Port: %s",
+                        port_to_string(offset, tvb, e_bit,buff_port));
+    offset +=4;
+
+  }
+}
+
+/* *********************************************************************** */
+
+
+/* *********************************************************************** *
+ *                                                                         *
+ *                 subdissector for submessage: INFO_DST                   *
+ *                                                                         *
+ * *********************************************************************** */
+ /* HOTOVO 12.01.04 - JEN OTESOVAT :]*/
+static void
+dissect_INFO_DST(tvbuff_t *tvb,gint offset,proto_tree *tree)
+{
+  proto_item             *ti;
+  proto_tree             *rtps_submessage_tree;
+  gint                    flags = 0;
+  char                    buff[200];
+
+  ti = proto_tree_add_text(tree, tvb, offset,1,"Submessage Id: INFO_DST");
+  rtps_submessage_tree = proto_item_add_subtree(ti, ett_rtps_submessage);
+  offset+=1;
+
+  flags = tvb_get_guint8(tvb, offset);
+  /*  Flags -- if you want to see - just uncomment -- */
+  /*
+   proto_tree_add_item(rtps_submessage_tree, hf_rtps_submessage_flags, 
+                       tvb, offset, 1, FALSE);
+   */
+  offset +=1;
+
+  /*  E flag |XXXX|HAPE| => masks with 000000001b = 1 */
+  if ((flags & FLAG_E) != 0)      e_bit = LITTLE_ENDIAN;
+   else                           e_bit = BIG_ENDIAN;
+
+  /*  Offset to Next Header -- if you want to see - just uncomment */
+  /*
+   proto_tree_add_text(rtps_submessage_tree, tvb, offset, 2,
+                       "Octets_to_next_header + offset (NEW): 0x%X",
+                       next_submsg_offset);
+   */
+  offset +=2;
+
+  /*  Host Id */
+  proto_tree_add_text(rtps_submessage_tree, tvb, offset, 4,
+                      "Host ID:            %s",
+                      host_id_to_string(offset,tvb,buff));
+  offset+=4;
+
+  /*  App Id */
+  proto_tree_add_text(rtps_submessage_tree, tvb, offset, 4,
+                      "App ID:             %s-new",
+                      app_id_to_string(offset, tvb, buff));
+  offset +=4;
+
+}
+
+/* *********************************************************************** *
+ *                                                                         *
+ *                       Register the protocol with Ethereal               *
+ *                                                                         *
+ * *********************************************************************** */
+
+void proto_register_rtps(void)
+{
+  static hf_register_info hf[] = {
+
+    { &hf_rtps_submessage_flags,
+      { "Submessage flags", "rtps.submessage_flags",
+         FT_BYTES, BASE_HEX, NULL, 0x0,
+        "Submessage flags", HFILL }},
+
+
+    { &hf_rtps_issue_data,
+      { "User Data", "rtps.issue_data",
+         FT_BYTES, BASE_HEX, NULL, 0x0,
+        "Issue Data", HFILL }},
+  };
+
+  static gint *ett[] = {
+    &ett_rtps,
+    &ett_rtps_submessage,
+    &ett_rtps_bitmap,
+  };
+
+  proto_rtps = proto_register_protocol("Real-Time Publish-Subscribe Wire Protocol",
+                                       "RTPS", "rtps");
+  proto_register_field_array(proto_rtps, hf, array_length(hf));
+  proto_register_subtree_array(ett, array_length(ett));
+
+}
+
+
+void
+proto_reg_handoff_rtps(void)
+{
+ heur_dissector_add("udp", dissect_rtps, proto_rtps);
+}
+
diff --git a/packet-rtps.h b/packet-rtps.h
new file mode 100644 (file)
index 0000000..ddd1141
--- /dev/null
@@ -0,0 +1,250 @@
+/*
+ *  $Id: packet-rtps.h,v 1.1 2004/04/17 21:43:32 guy Exp $
+ *
+ *  AUTHOR: Petr Smolik                 petr.smolik@wo.cz
+ *
+ *  ORTE - OCERA Real-Time Ethernet     http://www.ocera.org/
+ *  --------------------------------------------------------------------
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *  
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *  
+ */
+#ifndef _TYPEDEFS_DEFINES_RTPS_H
+#define _TYPEDEFS_DEFINES_RTPS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define RTPS_HEADER_LENGTH   16
+
+#define MAX_PATHNAME         128
+#define MAX_TYPENAME         128
+#define ORTE_TRUE            1
+#define ORTE_FALSE           0
+
+typedef int8_t                   Boolean;
+
+typedef int8_t                   PathName[MAX_PATHNAME];
+typedef int8_t                   TypeName[MAX_TYPENAME];
+
+typedef int32_t                  TypeChecksum;
+
+/*****************************************************************/
+/*             Wire Protocol Specification (WPS)                 */
+/*****************************************************************/
+
+         
+/**
+  Host identifier.
+   
+  for example: IP address working nodes
+*/
+typedef int32_t                  HostId;
+#define HID_UNKNOWN              0x00
+
+/**
+  Application identifier.
+
+  composed from: 3 bytes - instance Id
+                 1 byte  - appKind (1 - ManagedApplication, 2 - Manager) 
+*/
+typedef int32_t                  AppId;
+#define AID_UNKNOWN              0x00
+#define MANAGEDAPPLICATION       0x01
+#define MANAGER                  0x02
+
+/**
+  Object identifier.
+   
+  composed from: 3 bytes - instance Id
+                 1 byte  - objKind
+*/
+typedef int32_t                  ObjectId;
+
+#define OID_UNKNOWN              0x00000000
+#define OID_APP                  0x000001C1
+#define OID_WRITE_APPSELF        0x000008C2
+#define OID_READ_APPSELF         0x000008C7
+#define OID_WRITE_APP            0x000001C2
+#define OID_READ_APP             0x000001C7
+#define OID_WRITE_MGR            0x000007C2
+#define OID_READ_MGR             0x000007C7
+#define OID_WRITE_PUBL           0x000003C2
+#define OID_READ_PUBL            0x000003C7
+#define OID_WRITE_SUBS           0x000004C2
+#define OID_READ_SUBS            0x000004C7
+//Kind
+#define OID_APPLICATION      0x01
+#define OID_CSTWRITER        0x02
+#define OID_PUBLICATION      0x03
+#define OID_SUBSCRIPTION     0x04
+#define OID_CSTREADER        0x07
+//
+#define OID_USEROBJ          0x00
+#define OID_RESUSEROBJ       0x40
+#define OID_METAOBJ          0x80
+#define OID_RESMETAOBJ       0xC0
+
+typedef struct {
+       HostId                hid;
+       AppId                 aid;
+       ObjectId              oid;
+     } GUID_RTPS;    
+
+typedef struct {
+       int8_t                major;
+       int8_t                minor;
+     } VendorId;
+
+#define VENDOR_ID_UNKNOWN(id)    {id.major=0;id.minor=0;}
+#define VENDOR_ID_RTI(id)        {id.major=1;id.minor=1;}
+#define VENDOR_ID_OCERA(id)      {id.major=0;id.minor=0;}
+
+typedef struct {
+       int8_t                major;
+       int8_t                minor;
+     } ProtocolVersion;
+
+#define PROTOCOL_VERSION_1_0(pv) {pv.major=1;pv.minor=0;}
+
+typedef struct {
+       int32_t               high;
+       int32_t               low;
+     } SequenceNumber;
+
+
+#define SEQUENCE_NUMBER_NONE(sn)    {sn.high=0;sn.low=0;}
+#define SEQUENCE_NUMBER_UNKNOWN(sn) {sn.high=0x7fffffff;sn.low=0xffffffff;}
+
+
+typedef struct {
+       int32_t               seconds;    /* time in seconds */
+       u_int32_t             fraction;   /* time in seconds / 2^32 */
+     } NtpTime;
+
+#define NTPTIME_ZERO(t)          {t.seconds=0;t.fraction=0;}
+#define NTPTIME_BUILD(t,s)       {t.seconds=s;t.fraction=0;}
+#define NTPTIME_INFINITE(t)      {t.seconds=0xffffffff;t.fraction=0;}
+
+typedef int32_t                  IPAddress;
+
+#define IPADDRESS_INVALID        0
+
+typedef int32_t                     Port;
+
+#define PORT_INVALID             0
+
+typedef enum {
+       PAD                       = 0x01,
+       VAR                       = 0x02,
+       ISSUE                     = 0x03,
+       ACK                       = 0x06,
+       HEARTBEAT                 = 0x07,
+       GAP                       = 0x08,
+       INFO_TS                   = 0x09,
+       INFO_SRC                  = 0x0c,
+       INFO_REPLY                = 0x0d,
+       INFO_DST                  = 0x0e,
+       APP_QUIT                  = 0x90
+     } SubmessageId;
+
+typedef struct {
+       ProtocolVersion           sourceVersion;
+       VendorId                  sourceVendorId;
+       HostId                    sourceHostId;
+       AppId                     sourceAppId;
+       HostId                    destHostId;
+       AppId                     destAppId;
+       IPAddress                 unicastReplyIPAddress;
+       Port                      unicastReplyPort;
+       IPAddress                 multicastReplyIPAddress;
+       Port                      multicastReplyPort;
+       Boolean                   haveTimestamp;
+       NtpTime                   timestamp;          
+     } MessageInterpret;
+
+
+#define PID_PAD                             0x00
+#define PID_SENTINEL                        0x01
+#define PID_EXPIRATION_TIME                 0x02
+#define PID_PERSISTENCE                     0x03
+#define PID_MINIMUM_SEPARATION              0x04
+#define PID_TOPIC                           0x05
+#define PID_STRENGTH                        0x06
+#define PID_TYPE_NAME                       0x07
+#define PID_TYPE_CHECKSUM                   0x08
+#define RTPS_PID_TYPE2_NAME                 0x09
+#define RTPS_PID_TYPE2_CHECKSUM             0x0a
+#define PID_METATRAFFIC_MULTICAST_IPADDRESS 0x0b  /*tady byla chyba MATA_TRAFF....*/
+#define PID_APP_IPADDRESS                   0x0c
+#define PID_METATRAFFIC_UNICAST_PORT        0x0d
+#define PID_USERDATA_UNICAST_PORT           0x0e
+#define PID_IS_RELIABLE                     0x0f
+#define PID_EXPECTS_ACK                     0x10
+#define PID_USERDATA_MULTICAST_IPADDRESS    0x11
+#define PID_MANAGER_KEY                     0x12
+#define PID_SEND_QUEUE_SIZE                 0x13
+#define PID_RELIABILITY_ENABLED             0x14
+#define PID_PROTOCOL_VERSION                0x15
+#define PID_VENDOR_ID                       0x16
+#define PID_VARGAPPS_SEQUENCE_NUMBER_LAST   0x17
+#define PID_RECV_QUEUE_SIZE                 0x18
+#define PID_RELIABILITY_OFFERED             0x19
+#define PID_RELIABILITY_REQUESTED           0x1a
+
+/* possible values for PID_RELIABILITY_REQUEST */
+#define PID_VALUE_RELIABILITY_BEST_EFFORTS  0x01
+#define PID_VALUE_RELIABILITY_STRICT        0x02
+
+typedef u_int16_t ParameterId;
+typedef u_int16_t ParameterLength;
+
+/* State Machines */
+typedef enum {
+        MAYSENDHB                           = 0x01,
+        MUSTSENDHB                          = 0x02,
+        SENDHB                              = 0x03
+      } StateMachineHB;
+
+typedef enum {
+        NOTHNIGTOSEND                       = 0x01,
+        MUSTSENDDATA                        = 0x02
+      } StateMachineSend;
+
+typedef enum {
+        NEW                                 = 0x01,
+        TOSEND                              = 0x02,
+        UNDERWAY                            = 0x03,
+        UNACKNOWLEDGED                      = 0x04,
+        ANNOUCED                            = 0x05,
+        ACKNOWLEDGED                        = 0x06
+      } StateMachineChFReader;
+
+typedef enum {
+        WAITING                             = 0x01,
+        PULLING                             = 0x02,
+        ACKPENDING                          = 0x03
+      } StateMachineACK;
+
+typedef enum {
+        FUTURE                              = 0x01,
+        REQUESTED                           = 0x02,
+        MISSING                             = 0x03,
+        RECEIVED                            = 0x04
+      } StateMachineChFWriter;
+
+#ifdef __cplusplus
+} /* extern "C"*/
+#endif
+            
+#endif /* _TYPEDEFS_DEFINES_RTPS_H */