/* test_headers.c
*
* Tests header parsing. You probably won't need this. !Red!
*
*
* Copyright (C) 2013 Tox project All Rights Reserved.
*
* This file is part of Tox.
*
* Tox 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 3 of the License, or
* (at your option) any later version.
*
* Tox 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 Tox. If not, see .
*
*/
#include "test_helper.h"
#include "../toxrtp.h"
#include "../toxrtp_message.h"
#include
#include
#include
#include
#include
#include "../toxrtp_error_id.h"
#define _CT_HEADERS_
#ifdef _CT_HEADERS
int _socket;
pthread_mutex_t _mutex;
int print_help()
{
puts (
" Usage: Tuxrtp [-s (send mode) -d IP ( destination ) -p PORT ( dest Port )] \n"
" [-r ( recv mode ) ]"
);
return FAILURE;
}
void print_session_stats ( rtp_session_t* _m_session )
{
printf
(
"Session test:\n"
"\tPackets sent:%d\n"
"\tPackets recv:%d\n\n"
"\tBytes sent:%d\n"
"\tBytes recv:%d\n\n"
"\tHeader CCSRs:%d\n"
,
_m_session->_packets_sent,
_m_session->_packets_recv,
_m_session->_bytes_sent,
_m_session->_bytes_recv,
_m_session->_cc
);
uint8_t i;
for ( i = 0; i < _m_session->_cc; i++ ) {
printf (
"\t%d > :%d\n", i, _m_session->_csrc[i]
);
}
}
void print_header_info ( rtp_header_t* _header )
{
printf
(
"Header info:\n"
"\tVersion :%d\n"
"\tPadding :%d\n"
"\tExtension :%d\n"
"\tCSRC count :%d\n"
"\tPayload type :%d\n"
"\tMarker :%d\n\n"
"\tSSrc :%d\n"
"\tSequence num :%d\n"
"\tLenght: :%d\n"
"\tCSRC's:\n"
,
rtp_header_get_flag_version ( _header ),
rtp_header_get_flag_padding ( _header ),
rtp_header_get_flag_extension ( _header ),
rtp_header_get_flag_CSRC_count ( _header ),
rtp_header_get_setting_payload_type ( _header ),
rtp_header_get_setting_marker ( _header ),
_header->_ssrc,
_header->_sequence_number,
_header->_length
);
uint8_t i;
for ( i = 0; i < rtp_header_get_flag_CSRC_count ( _header ); i++ ) {
printf (
"\t%d > :%d\n", i, _header->_csrc[i]
);
}
puts ( "\n" );
}
void print_ext_header_info(rtp_ext_header_t* _ext_header)
{
printf
(
"External Header info: \n"
"\tLenght :%d\n"
"\tID :%d\n"
"\tValue H :%d\n"
"\tValue W :%d\n\n",
_ext_header->_ext_len,
_ext_header->_ext_type,
rtp_get_resolution_marking_height(_ext_header, 0),
rtp_get_resolution_marking_width(_ext_header, 0)
);
}
int rtp_handlepacket ( rtp_session_t* _session, rtp_msg_t* _msg )
{
if ( !_msg )
return FAILURE;
if ( rtp_check_late_message(_session, _msg) < 0 ) {
rtp_register_msg(_session, _msg);
}
if ( _session->_last_msg ) {
_session->_last_msg->_next = _msg;
_session->_last_msg = _msg;
} else {
_session->_last_msg = _session->_oldest_msg = _msg;
}
return SUCCESS;
}
void* receivepacket_callback(void* _p_session)
{
rtp_msg_t* _msg;
rtp_session_t* _session = _p_session;
uint32_t _bytes;
tox_IP_Port _from;
uint8_t _socket_data[MAX_UDP_PACKET_SIZE];
int _m_socket = _socket;
while ( 1 )
{
int _status = receivepacket ( _m_socket, &_from, _socket_data, &_bytes );
if ( _status == FAILURE ) { /* nothing recved */
usleep(1000);
continue;
}
pthread_mutex_lock ( &_mutex );
_msg = rtp_msg_parse ( NULL, _socket_data, _bytes );
rtp_handlepacket(_session, _msg);
pthread_mutex_unlock ( &_mutex );
}
pthread_exit(NULL);
}
int main ( int argc, char* argv[] )
{
arg_t* _list = parse_args ( argc, argv );
if ( _list == NULL ) { /* failed */
return print_help();
}
pthread_mutex_init ( &_mutex, NULL );
int status;
IP_Port Ip_port;
const char* ip;
uint16_t port;
const uint8_t* test_bytes [300];
memset(test_bytes, 'a', 300);
rtp_session_t* _m_session;
rtp_msg_t* _m_msg;
if ( find_arg_simple ( _list, "-r" ) != FAILURE ) { /* Server mode */
IP_Port LOCAL_IP; /* since you need at least 1 recv-er */
LOCAL_IP.ip.i = htonl(INADDR_ANY);
LOCAL_IP.port = RTP_PORT;
LOCAL_IP.padding = -1;
_m_session = rtp_init_session ( -1, -1 );
Networking_Core* _networking = new_networking(LOCAL_IP.ip, RTP_PORT_LISTEN);
_socket = _networking->sock;
if ( !_networking ){
pthread_mutex_destroy ( &_mutex );
return FAILURE;
}
int _socket = _networking->sock;
if ( status < 0 ) {
pthread_mutex_destroy ( &_mutex );
return FAILURE;
}
/* -- start in recv mode, get 1 message and then analyze it -- */
pthread_t _tid;
RUN_IN_THREAD(receivepacket_callback, _tid, _m_session)
for ( ; ; ) { /* Recv for x seconds */
_m_msg = rtp_recv_msg ( _m_session );
/* _m_msg = rtp_session_get_message_queded ( _m_session ); DEPRECATED */
if ( _m_msg ) {
/*rtp_free_msg(_m_session, _m_msg);
_m_msg = NULL;*/
printf("Timestamp: %d\n", _m_msg->_header->_timestamp);
}
usleep ( 10000 );
}
if ( _m_msg->_header ) {
rtp_header_print ( _m_msg->_header );
}
if ( _m_msg->_ext_header ){
print_ext_header_info(_m_msg->_ext_header);
}
//print_session_stats ( _m_session );
//printf ( "Payload: ( %d ) \n%s\n", _m_msg->_length, _m_msg->_data );
} else if ( find_arg_simple ( _list, "-s" ) != FAILURE ) {
ip = find_arg_duble ( _list, "-d" );
if ( ip == NULL ) {
pthread_mutex_destroy ( &_mutex );
return FAILURE;
}
const char* _port = find_arg_duble ( _list, "-p" );
if ( _port != NULL ) {
port = atoi ( _port );
}
t_setipport ( ip, port, &Ip_port );
printf ( "Remote: %s:%d\n", ip, port );
Networking_Core* _networking = new_networking(Ip_port.ip, RTP_PORT);
if ( !_networking ){
pthread_mutex_destroy ( &_mutex );
return FAILURE;
}
int _socket = _networking->sock;
_m_session = rtp_init_session ( -1, -1 );
rtp_add_receiver( _m_session, &Ip_port );
//rtp_add_resolution_marking(_m_session, 1920, 1080);
//rtp_add_framerate_marking(_m_session, 1000);
puts ( "Now sending payload!\n" );
uint16_t _first_sequ = _m_session->_sequence_number;
/* use already defined buffer lenght */
while ( 1 ){
_m_msg = rtp_msg_new ( _m_session, test_bytes, 300 );
rtp_send_msg ( _m_session, _m_msg, _socket );
usleep(10000);
}
if ( _m_session->_last_error ) {
puts ( _m_session->_last_error );
}
return rtp_terminate_session(_m_session);
} else {
pthread_mutex_destroy ( &_mutex );
return FAILURE;
}
pthread_mutex_destroy ( &_mutex );
return SUCCESS;
}
#endif /* _CT_HEADERS */