Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix entity GUID parsing and improve with security entities #10

Merged
merged 4 commits into from
Dec 19, 2016
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 10 additions & 7 deletions logparser/network/network.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,9 @@
from logparser.devices.logger import (log_cfg, log_error, log_process,
log_recv, log_send, log_warning)
from logparser.utils import (add_statistics_bandwidth, add_statistics_packet,
get_locator, get_oid, get_participant,
get_port_name, get_port_number, hex2ip,
is_builtin_entity, parse_guid, parse_sn)
get_data_packet_name, get_locator, get_oid,
get_participant, get_port_name, get_port_number,
hex2ip, is_builtin_entity, parse_guid, parse_sn)


# --------------------------------------------------------------------------- #
Expand Down Expand Up @@ -169,12 +169,13 @@ def on_send_data(match, state):
def on_resend_data(match, state):
"""It happens when the writer resend a DATA message."""
writer_oid = get_oid(match[0])
packet_name = get_data_packet_name(match[0])
remote_part = parse_guid(state, match[1], match[2], match[3])
remote_oid = get_oid(match[4])
seqnum = parse_sn(match[5])
verb = 1 if is_builtin_entity(match[0]) else 0
log_send(remote_part, writer_oid,
"Resend DATA (%d) to reader %s" % (seqnum, remote_oid),
"Resend %s [%d] to reader %s" % (packet_name, seqnum, remote_oid),
state, verb)


Expand Down Expand Up @@ -329,6 +330,7 @@ def on_receive_data(match, state):
remote = match[5].split('.')
writer_addr = parse_guid(state, remote[0], remote[1], remote[2])
writer_oid = get_oid(remote[3])
packet = get_data_packet_name(remote[3]) if packet == "DATA" else packet

# Sequece number check
full_id = writer_addr + "." + writer_oid + ' to ' + reader_oid
Expand All @@ -345,7 +347,7 @@ def on_receive_data(match, state):

# Show the message after any possible warning.
verb = 1 if is_builtin_entity(remote[3]) else 0
log_recv(writer_addr, reader_oid, "Received %s (%d) from writer %s (%s)" %
log_recv(writer_addr, reader_oid, "Received %s [%d] from writer %s (%s)" %
(packet, seqnum, writer_oid, comm),
state, verb)

Expand All @@ -358,9 +360,10 @@ def on_receive_out_order_data(match, state):
remote = match[3].split('.')
writer_addr = parse_guid(state, remote[0], remote[1], remote[2])
writer_oid = get_oid(remote[3])
packet_name = get_data_packet_name(remote[3])
verb = 1 if is_builtin_entity(remote[3]) else 0
log_recv(writer_addr, reader_oid, "Received %s DATA (%d) from writer %s" %
(kind, seqnum, writer_oid),
log_recv(writer_addr, reader_oid, "Received %s %s [%d] from writer %s" %
(kind, packet_name, seqnum, writer_oid),
state, verb)


Expand Down
71 changes: 49 additions & 22 deletions logparser/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,9 @@
+ add_statistics_packets: Add the given packet to the packet statistics.
+ add_statistics_bandwidth: Add the given packet to the bandwidth statistics.
+ obfuscate: Obfuscate the given text.
+ get_oid: Parse the entity object ID and conver to text.
+ is_builtin_entity: Get if the OID hex number is for a built-in entity.
+ get_oid: Get a name for the entity ID in hexadecimal text format.
+ is_builtin_entity: Return if the OID hex number is for a built-in entity.
+ get_data_packet_name: Return the DATA packet name.
+ get_topic_name: Get the topic name, obfuscating if needed.
+ get_type_name: Get the type name, obfuscating if needed.
+ get_port_number: Get the port number, obfuscating if needed.
Expand Down Expand Up @@ -166,35 +167,61 @@ def obfuscate(text, state):


def get_oid(oid):
"""Parse the entity object ID and conver to text."""
oid_names = {
# Built-in OID names.
0x00000000: "UNKNOWN", 0x000001c1: "BUILTIN_PARTIC",
0x000002c2: "TOPIC_WRITER", 0x000002c7: "TOPIC_READER",
0x000003c2: "PUB_WRITER", 0x000003c7: "PUB_READER",
0x000004c2: "SUB_WRITER", 0x000004c7: "SUB_READER",
0x000100c2: "PARTIC_WRITER", 0x000100c7: "PARTIC_READER",
0x000200c2: "MESSAGE_WRITER", 0x000200c7: "MESSAGE_READER"}
user_oid_kind = {
# Application defined entities.
0x00: "UNK", 0x01: "PAR",
"""Get a name for the entity ID in hexadecimal text format."""
# Information from RTPS Spec: http://www.omg.org/spec/DDSI-RTPS/2.2/PDF/
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that is better to link to here http://www.omg.org/spec/DDSI-RTPS/

# Security entities: http://www.omg.org/spec/DDS-SECURITY/1.0/Beta2/
BUILTIN_NAMES = {
# Built-in Entity GUIDs
0x00000000: "UNKNOWN", 0x000001c1: "PARTICIPANT",
0x000002c2: "SED_TOPIC_WRITER", 0x000002c7: "SED_TOPIC_READER",
0x000003c2: "SED_PUB_WRITER", 0x000003c7: "SED_PUB_READER",
0x000004c2: "SED_SUB_WRITER", 0x000004c7: "SED_SUB_READER",
0x000100c2: "SPD_PART_WRITER", 0x000100c7: "SPD_PART_READER",
0x000200c2: "MESSAGE_WRITER", 0x000200c7: "MESSAGE_READER",
# Security Built-in Entity GUIDs
0xff0003c2: "SED_PUB_SEC_WRITER", 0xff0003c7: "SED_PUB_SEC_READER",
0xff0004c2: "SED_SUB_SEC_WRITER", 0xff0004c7: "SED_SUB_SEC_READER",
0xff0200c2: "MSG_SEC_WRITER", 0xff0200c7: "MSG_SEC_READER",
0x000201c2: "MSG_STA_SEC_WRITER", 0x000201c7: "MSG_STA_SEC_READER",
0xff0202c2: "MSG_VOL_SEC_WRITER", 0xff0202c7: "MSG_VOL_SEC_READER"}
ENTITY_ORIGINS = {0x00: "USER", 0x40: "VEND", 0xc0: "BUILTIN"}
ENTITY_KINDS = {
0x00: "UNK", 0x01: "PART",
0x02: "W+K", 0x03: "W-K",
0x04: "R-K", 0x07: "R+K"}

# Convert into a number from the hexadecimal text representation
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could be this easier to understand?

# Convert the hexadecimal text representation to a number

oid_num = int(oid, 16)
if oid_num & 0x80000000 == 0:
name = oid_names[oid_num] if oid_num in oid_names else oid

# Analyze the entity kind
entity_kind = oid_num & 0xFF
origin = ENTITY_ORIGINS[entity_kind & 0xC0]
kind = ENTITY_KINDS[entity_kind & 0x3F]

if origin == "BUILTIN":
name = BUILTIN_NAMES[oid_num]
elif origin == "USER":
name = kind + "_" + hex(oid_num >> 8)[2:].zfill(6)
else:
kind = oid_num & 0xFF
kind = user_oid_kind[kind] if kind in user_oid_kind else "INV"
num = (oid_num & 0x7FFFF000) >> 13
name = str(num).zfill(2) + "_" + kind
name = origin + "_" + kind + "_" + hex(oid_num >> 8)[2:].zfill(6)
return name


def is_builtin_entity(oid):
"""Get if the OID hex number is for a built-in entity."""
"""Return if the OID hex number is for a built-in entity."""
# More information in get_oid
oid_num = int(oid, 16)
return oid_num & 0x80000000 == 0
return oid_num & 0xC0 == 0xC0


def get_data_packet_name(oid):
"""Return the DATA packet name."""
# More information in get_oid
entity_name = get_oid(oid)
PACKET_NAMES = {
"SED_PUB_WRITER": "DATA(w)", "SED_SUB_WRITER": "DATA(r)",
"SPD_PART_WRITER": "DATA(p)", "MESSAGE_WRITER": "DATA(m)"}
return PACKET_NAMES[entity_name] if entity_name in PACKET_NAMES else "DATA"


def get_topic_name(topic, state):
Expand Down