def test_udp_handshake(packets, channels): unpacked = packer.unpack(packets['udp_handshake'], channels) assert unpacked.header.flags.payload_type == enum.RtpPayloadType.UDPHandshake assert unpacked.header.ssrc.connection_id == 35795 assert unpacked.payload.unk == 1
def test_video_server_handshake(packets, channels): unpacked = packer.unpack(packets['tcp_video_server_handshake'], channels) assert unpacked.header.flags.payload_type == enum.RtpPayloadType.Streamer assert unpacked.header.streamer.streamer_version == 3 assert unpacked.header.streamer.sequence_num == 1 assert unpacked.header.streamer.prev_sequence_num == 0 assert unpacked.header.streamer.type == enum.VideoPayloadType.ServerHandshake assert unpacked.payload.protocol_version == 5 assert unpacked.payload.width == 1280 assert unpacked.payload.height == 720 assert unpacked.payload.fps == 30 assert unpacked.payload.reference_timestamp == datetime.datetime.utcfromtimestamp( 1495315092425 / 1000) assert len(unpacked.payload.formats) == 4 assert unpacked.payload.formats[0].fps == 30 assert unpacked.payload.formats[0].width == 1280 assert unpacked.payload.formats[0].height == 720 assert unpacked.payload.formats[0].codec == enum.VideoCodec.H264 assert unpacked.payload.formats[1].fps == 30 assert unpacked.payload.formats[1].width == 960 assert unpacked.payload.formats[1].height == 540 assert unpacked.payload.formats[1].codec == enum.VideoCodec.H264 assert unpacked.payload.formats[2].fps == 30 assert unpacked.payload.formats[2].width == 640 assert unpacked.payload.formats[2].height == 360 assert unpacked.payload.formats[2].codec == enum.VideoCodec.H264 assert unpacked.payload.formats[3].fps == 30 assert unpacked.payload.formats[3].width == 320 assert unpacked.payload.formats[3].height == 180 assert unpacked.payload.formats[3].codec == enum.VideoCodec.H264
def test_channel_create(packets, channels): unpacked = packer.unpack(packets['tcp_channel_create'], channels) assert unpacked.header.flags.payload_type == enum.RtpPayloadType.ChannelControl assert unpacked.payload.type == enum.ChannelControlPayloadType.ChannelCreate assert unpacked.payload.name == enum.ChannelClass.Video assert unpacked.payload.flags == 0
def test_input_frame_ack(packets, channels): unpacked = packer.unpack(packets['udp_input_frame_ack'], channels) assert unpacked.header.flags.payload_type == enum.RtpPayloadType.Streamer assert unpacked.header.streamer.streamer_version == 0 assert unpacked.header.streamer.type == enum.InputPayloadType.FrameAck assert unpacked.payload.acked_frame == 672208545
def _test_repack_all(packets, channels): for f in packets: unpacked = packer.unpack(packets[f]) msg = message.struct(**unpacked) repacked = packer.pack(msg, channels) assert repacked == packets[f], \ '%s was not repacked correctly:\n(repacked)%s\n!=\n(original)%s' \ % (f, hexlify(repacked), hexlify(packets[f]))
def handle(self, data, addr): if not self.connected.is_set(): self.connected.set() try: msg = packer.unpack(data, self._nano.channels) msg(_incoming_ts=time.time()) self.on_message(msg) except Exception as e: log.exception("Exception in StreamerProtocol message handler")
def datagram_received(self, data, addr): if not self.connected.done(): self.connected.set_result(True) try: msg = packer.unpack(data, self._nano.channels) msg(_incoming_ts=time.time()) self.on_message(msg) except Exception as e: log.exception("Exception in StreamerProtocol message handler")
def test_audio_data(packets, channels): unpacked = packer.unpack(packets['udp_audio_data'], channels) assert unpacked.header.flags.payload_type == enum.RtpPayloadType.Streamer assert unpacked.header.streamer.streamer_version == 0 assert unpacked.header.streamer.type == enum.AudioPayloadType.Data assert unpacked.payload.flags == 4 assert unpacked.payload.frame_id == 0 assert unpacked.payload.timestamp == 3365588462 assert len(unpacked.payload.data) == 357
def test_input_client_handshake(packets, channels): unpacked = packer.unpack(packets['tcp_input_client_handshake'], channels) assert unpacked.header.flags.payload_type == enum.RtpPayloadType.Streamer assert unpacked.header.streamer.streamer_version == 3 assert unpacked.header.streamer.sequence_num == 1 assert unpacked.header.streamer.prev_sequence_num == 0 assert unpacked.header.streamer.type == enum.InputPayloadType.ClientHandshake assert unpacked.payload.max_touches == 10 assert unpacked.payload.reference_timestamp == datetime.datetime.utcfromtimestamp( 1498690645999 / 1000)
def test_audio_control(packets, channels): unpacked = packer.unpack(packets['tcp_audio_control'], channels) assert unpacked.header.flags.payload_type == enum.RtpPayloadType.Streamer assert unpacked.header.streamer.streamer_version == 3 assert unpacked.header.streamer.sequence_num == 2 assert unpacked.header.streamer.prev_sequence_num == 1 assert unpacked.header.streamer.type == enum.AudioPayloadType.Control assert unpacked.payload.flags.reinitialize is False assert unpacked.payload.flags.start_stream is True assert unpacked.payload.flags.stop_stream is False
def test_audio_client_handshake(packets, channels): unpacked = packer.unpack(packets['tcp_audio_client_handshake'], channels) assert unpacked.header.flags.payload_type == enum.RtpPayloadType.Streamer assert unpacked.header.streamer.streamer_version == 3 assert unpacked.header.streamer.sequence_num == 1 assert unpacked.header.streamer.prev_sequence_num == 0 assert unpacked.header.streamer.type == enum.AudioPayloadType.ClientHandshake assert unpacked.payload.initial_frame_id == 693041842 assert unpacked.payload.requested_format.channels == 2 assert unpacked.payload.requested_format.sample_rate == 48000 assert unpacked.payload.requested_format.codec == enum.AudioCodec.AAC
def test_control_msg_with_header(packets, channels): unpacked = packer.unpack(packets['tcp_control_msg_with_header'], channels) assert unpacked.header.flags.payload_type == enum.RtpPayloadType.Streamer assert unpacked.header.streamer.streamer_version == 3 assert unpacked.header.streamer.sequence_num == 1 assert unpacked.header.streamer.prev_sequence_num == 0 assert unpacked.header.streamer.type == 0 assert unpacked.payload.prev_seq_dup == 0 assert unpacked.payload.unk1 == 1 assert unpacked.payload.unk2 == 1406 assert unpacked.payload.opcode == enum.ControlPayloadType.RealtimeTelemetry
def test_video_client_handshake(packets, channels): unpacked = packer.unpack(packets['tcp_video_client_handshake'], channels) assert unpacked.header.flags.payload_type == enum.RtpPayloadType.Streamer assert unpacked.header.streamer.streamer_version == 3 assert unpacked.header.streamer.sequence_num == 1 assert unpacked.header.streamer.prev_sequence_num == 0 assert unpacked.header.streamer.type == enum.VideoPayloadType.ClientHandshake assert unpacked.payload.initial_frame_id == 3715731054 assert unpacked.payload.requested_format.fps == 30 assert unpacked.payload.requested_format.width == 1280 assert unpacked.payload.requested_format.height == 720 assert unpacked.payload.requested_format.codec == enum.VideoCodec.H264
def test_rtpheader_tcp(packets, channels): unpacked = packer.unpack(packets['tcp_control_handshake'], channels) assert unpacked.header.flags.version, 2 assert unpacked.header.flags.padding is True assert unpacked.header.flags.extension is False assert unpacked.header.flags.csrc_count == 0 assert unpacked.header.flags.marker is False assert unpacked.header.flags.payload_type == enum.RtpPayloadType.Control assert unpacked.header.sequence_num == 0 assert unpacked.header.timestamp == 2847619159 assert unpacked.header.ssrc.connection_id == 0 assert unpacked.header.ssrc.channel_id == 0 assert len(unpacked.header.csrc_list) == 0
def test_rtpheader_udp(packets, channels): unpacked = packer.unpack(packets['udp_video_data'], channels) assert unpacked.header.flags.version == 2 assert unpacked.header.flags.padding is True assert unpacked.header.flags.extension is False assert unpacked.header.flags.csrc_count == 0 assert unpacked.header.flags.marker is False assert unpacked.header.flags.payload_type == enum.RtpPayloadType.Streamer assert unpacked.header.sequence_num == 1 assert unpacked.header.timestamp == 0 assert unpacked.header.ssrc.connection_id == 35795 assert unpacked.header.ssrc.channel_id == 1024 assert len(unpacked.header.csrc_list) == 0
def test_video_data(packets, channels): unpacked = packer.unpack(packets['udp_video_data'], channels) assert unpacked.header.flags.payload_type == enum.RtpPayloadType.Streamer assert unpacked.header.streamer.streamer_version == 0 assert unpacked.header.streamer.type == enum.VideoPayloadType.Data assert unpacked.payload.flags == 4 assert unpacked.payload.frame_id == 3715731054 assert unpacked.payload.timestamp == 3365613642 assert unpacked.payload.total_size == 5594 assert unpacked.payload.packet_count == 5 assert unpacked.payload.offset == 0 assert len(unpacked.payload.data) == 1119
def test_input_server_handshake(packets, channels): unpacked = packer.unpack(packets['tcp_input_server_handshake'], channels) assert unpacked.header.flags.payload_type == enum.RtpPayloadType.Streamer assert unpacked.header.streamer.streamer_version == 3 assert unpacked.header.streamer.sequence_num == 1 assert unpacked.header.streamer.prev_sequence_num == 0 assert unpacked.header.streamer.type == enum.InputPayloadType.ServerHandshake assert unpacked.payload.protocol_version == 3 assert unpacked.payload.desktop_width == 1280 assert unpacked.payload.desktop_height == 720 assert unpacked.payload.max_touches == 0 assert unpacked.payload.initial_frame_id == 672208545
def test_video_control(packets, channels): unpacked = packer.unpack(packets['tcp_video_control'], channels) assert unpacked.header.flags.payload_type == enum.RtpPayloadType.Streamer assert unpacked.header.streamer.streamer_version == 3 assert unpacked.header.streamer.sequence_num == 2 assert unpacked.header.streamer.prev_sequence_num == 1 assert unpacked.header.streamer.type == enum.VideoPayloadType.Control assert unpacked.payload.flags.request_keyframe is True assert unpacked.payload.flags.start_stream is True assert unpacked.payload.flags.stop_stream is False assert unpacked.payload.flags.queue_depth is False assert unpacked.payload.flags.lost_frames is False assert unpacked.payload.flags.last_displayed_frame is False
def test_audio_server_handshake(packets, channels): unpacked = packer.unpack(packets['tcp_audio_server_handshake'], channels) assert unpacked.header.flags.payload_type == enum.RtpPayloadType.Streamer assert unpacked.header.streamer.streamer_version == 3 assert unpacked.header.streamer.sequence_num == 1 assert unpacked.header.streamer.prev_sequence_num == 0 assert unpacked.header.streamer.type == enum.AudioPayloadType.ServerHandshake assert unpacked.payload.protocol_version == 4 assert unpacked.payload.reference_timestamp == datetime.datetime.utcfromtimestamp( 1495315092424 / 1000) assert len(unpacked.payload.formats) == 1 assert unpacked.payload.formats[0].channels == 2 assert unpacked.payload.formats[0].sample_rate == 48000 assert unpacked.payload.formats[0].codec == enum.AudioCodec.AAC
def test_input_frame(packets, channels): unpacked = packer.unpack(packets['udp_input_frame'], channels) assert unpacked.header.flags.payload_type == enum.RtpPayloadType.Streamer assert unpacked.header.streamer.streamer_version == 0 assert unpacked.header.streamer.type == enum.InputPayloadType.Frame assert unpacked.payload.frame_id == 672208564 assert unpacked.payload.timestamp == 583706515 assert unpacked.payload.created_ts == 583706495 assert unpacked.payload.buttons.dpad_up == 0 assert unpacked.payload.buttons.dpad_down == 0 assert unpacked.payload.buttons.dpad_left == 0 assert unpacked.payload.buttons.dpad_right == 1 assert unpacked.payload.buttons.start == 0 assert unpacked.payload.buttons.back == 0 assert unpacked.payload.buttons.left_thumbstick == 0 assert unpacked.payload.buttons.right_thumbstick == 0 assert unpacked.payload.buttons.left_shoulder == 0 assert unpacked.payload.buttons.right_shoulder == 0 assert unpacked.payload.buttons.guide == 0 assert unpacked.payload.buttons.unknown == 0 assert unpacked.payload.buttons.a == 0 assert unpacked.payload.buttons.b == 0 assert unpacked.payload.buttons.x == 0 assert unpacked.payload.buttons.y == 0 assert unpacked.payload.analog.left_trigger == 0 assert unpacked.payload.analog.right_trigger == 0 assert unpacked.payload.analog.left_thumb_x == 1752 assert unpacked.payload.analog.left_thumb_y == 684 assert unpacked.payload.analog.right_thumb_x == 1080 assert unpacked.payload.analog.right_thumb_y == 242 assert unpacked.payload.analog.rumble_trigger_l == 0 assert unpacked.payload.analog.rumble_trigger_r == 0 assert unpacked.payload.analog.rumble_handle_l == 0 assert unpacked.payload.analog.rumble_handle_r == 0 assert unpacked.payload.extension.byte_6 == 1 assert unpacked.payload.extension.byte_7 == 0 assert unpacked.payload.extension.rumble_trigger_l2 == 0 assert unpacked.payload.extension.rumble_trigger_r2 == 0 assert unpacked.payload.extension.rumble_handle_l2 == 0 assert unpacked.payload.extension.rumble_handle_r2 == 0 assert unpacked.payload.extension.byte_12 == 0 assert unpacked.payload.extension.byte_13 == 0 assert unpacked.payload.extension.byte_14 == 0
def parse(pcap_file, tcp_port, udp_port): width = shutil.get_terminal_size().columns col_width = width // 2 - 3 wrapper = textwrap.TextWrapper(col_width, replace_whitespace=False) with open(pcap_file, 'rb') as fh: for ts, buf in dpkt.pcap.Reader(fh): eth = dpkt.ethernet.Ethernet(buf) # Make sure the Ethernet data contains an IP packet if not isinstance(eth.data, dpkt.ip.IP): continue ip = eth.data if isinstance(ip.data, dpkt.tcp.TCP): if ip.data.sport != tcp_port and ip.data.dport != tcp_port: continue try: msgs = packer.unpack_tcp(ip.data.data, channels) msgs = list(msgs) except Exception as e: print("Error: {}".format(e)) continue is_client = ip.data.dport == tcp_port elif isinstance(ip.data, dpkt.udp.UDP): if ip.data.sport != udp_port and ip.data.dport != udp_port: continue try: msgs = [packer.unpack(ip.data.data, channels)] except Exception as e: print("Error: {}".format(e)) continue is_client = ip.data.dport == udp_port else: continue for msg in msgs: payload_type = msg.header.flags.payload_type channel_id = msg.header.ssrc.channel_id type_str = '%s Seq %i ' % \ (RtpPayloadType(payload_type), msg.header.sequence_num) if payload_type == RtpPayloadType.ChannelControl: type_str += ' (%s)' % \ ChannelControlPayloadType(msg.payload.type) # elif payload_type == PayloadType.Streamer: # type_str += ' (Type: %i)' \ # % msg.payload.streamer_header.packet_type if channel_id != 0: type_str += ' | %s' % channels[channel_id] direction = '>' if is_client else '<' print(' {} '.format(type_str).center(width, direction)) lines = str(msg).split('\n') for line in lines: line = wrapper.wrap(line) for i in line: if is_client: print('{0: <{1}}'.format(i, col_width), '│') else: print(' ' * col_width, '│', '{0}'.format(i, col_width))
def test_channel_close(packets, channels): unpacked = packer.unpack(packets['tcp_channel_close'], channels) assert unpacked.header.flags.payload_type == enum.RtpPayloadType.ChannelControl assert unpacked.payload.type == enum.ChannelControlPayloadType.ChannelClose assert unpacked.payload.flags == 0
def test_channel_open_with_flags(packets, channels): unpacked = packer.unpack(packets['tcp_channel_open_with_flags'], channels) assert unpacked.header.flags.payload_type == enum.RtpPayloadType.ChannelControl assert unpacked.payload.type == enum.ChannelControlPayloadType.ChannelOpen assert unpacked.payload.flags == b'\x01\x00\x02\x00'
def test_control_handshake(packets, channels): unpacked = packer.unpack(packets['tcp_control_handshake'], channels) assert unpacked.header.flags.payload_type == enum.RtpPayloadType.Control assert unpacked.payload.type == enum.ChannelControlPayloadType.ClientHandshake assert unpacked.payload.connection_id == 40084