6. Debugging RTPS Systems

In general, the Wireshark capture will contain a lot of information and you will need only a subset of it. There are a few very interesting filters that can help narrow down the information until you get exactly what you are looking for. These are presented below:

IP Level Filters:

  • ip.src: Filters the source IP addresses by IP address.

  • ip.dst: Filters the destination IP addresses by IP address.

  • ip.addr: Filters all the IP addresses (for example, “ip.addr == 192.168.1.0”).

UDP Level Filters:

  • udp.srcport: Filters the source ports by the specified port.

  • udp.dstport: Filters the destination ports by the specified port.

  • udp.port: Filters all the ports.

RTPS Level Filters:

  • rtps.guidPrefix.src: Filters the source GUID prefixes by the specified GUID.

  • rtps.guidPrefix.dst: Filters the destination GUID prefixes by the specified GUID.

  • rtps.guidPrefix: Filters all the GUID prefixes by the specified GUID.

  • rtps.trafficNature: Filters by traffic nature.

    • UNICAST_METATRAFFIC = 0

    • MULTICAST_USERTRAFFIC = 1

    • MULTICAST_METATRAFFIC = 2

    • UNICAST_USERTRAFFIC = 3

  • rtps.domain_id: ID of the domain to which the packet belongs. Since the domain ID is not present on all packets, Wireshark uses two methods to infer the domain ID:

    • It reads all the DATA(p) in the same capture file and takes the domain ID from the PID_RTI_DOMAIN_ID and PID_DOMAIN_ID submessages. Wireshark then uses hostId, appId, and instanceId together as a key for mapping the domain ID. On a second pass, Wireshark uses the hostId, appId, and instanceId of each packet to get the domain ID, if available.

    • It uses the destination port to try to calculate the domaind ID using the formula in the RTPS spec, assuming the DG, PB, and offsets (d0…d4) use the default values. If The domain ID is calculated, the message “Based on calculated domainId. Might not be accurate.” displays in the domain ID subtree.

    Domain ID values that are negative or higher than 232 are invalid and display as “unknown.”

  • rtps.sm.id: Filters by submessage ID. These are all the different values for the ID in Wireshark. (Note: Not all of them are sent by Connext DDS.)

    • (0x01) PAD

    • (0x02) DATA

    • (0x03) NOKEY_DATA

    • (0x06) ACKNACK

    • (0x07) HEARTBEAT

    • (0x08) GAP

    • (0x09) INFO_TS

    • (0x0c) INFO_SRC

    • (0x0d) INFO_REPLY_IP4

    • (0x0e) INFO_DST

    • (0x0f) INFO_REPLY

    • (0x10) DATA_FRAG

    • (0x11) NOKEY_DATA_FRAG

    • (0x12) NACK_FRAG

    • (0x13) HEARTBEAT_FRAG

    • (0x14) RTPS_DATA_SESSION

    • (0x15) RTPS_DATA

    • (0x16) RTPS_DATA_FRAG

    • (0x17) ACKNACK_BATCH

    • (0x18) RTPS_DATA_BATCH

    • (0x19) HEARTBEAT_BATCH

    • (0x1a) ACKNACK_SESSION

    • (0x1b) HEARTBEAT_SESSION

    • (0x1c) APP_ACK

    • (0x1d) APP_ACK_CONF

    • (0x1e) HEARTBEAT_VIRTUAL

    • (0x30) SEC_BODY

    • (0x31) SEC_PREFIX

    • (0x32) SEC_POSTFIX

    • (0x33) SRTPS_PREFIX

    • (0x34) SRTPS_POSTFIX

    • (0x80) RTI_CRC

  • rtps.sm.wrEntityId: Filters by DataWriter entity ID.

    By using both the guidPrefix and wrEntityId, you can filter by DataWriter GUID. For example:

    (rtps.guidPrefix.src == 0a:46:02:c7:00:00:27:08:00:00:00:01) &&
    (rtps.sm.wrEntityId == 0x000100c2)
    
  • rtps.param.topicName: Filters by Topic name.

  • rtps.param.typeName: Filters by Type name.

As you can see, there are a lot of filters that can be applied. Do not try to memorize all of them. Instead, right-click on top of the fields you want to use for filtering and use the “apply as filter” feature.

See Appendix: Filters with Predefined Values (Section 9) for a list of filters that have predefined values.

For a full list of available filters for each protocol version, please see https://www.wireshark.org/docs/dfref/r/rtps.html.