Modularizando o src
Dependencies: EALib EthernetInterface_vz mbed-rtos mbed
Fork of header_main_colinas_V0-20-09-14 by
Diff: sip.cpp
- Revision:
- 114:472502b31a12
- Parent:
- 113:db67ae00550e
- Child:
- 119:ee6a53069455
--- a/sip.cpp Thu Apr 16 12:57:13 2015 +0000 +++ b/sip.cpp Mon Apr 20 14:40:09 2015 +0000 @@ -11,9 +11,48 @@ } void Sip::__reconnect__( void ){ - __end_sock__(); + sock.close(); + sock.init(); + sock.bind( this->my_port ); +} +/* +Sip::Sip( char * server_ip, int server_port, char * my_ip, int my_port, int my_ext, int peer_ext, int id ){ + this->id = id; + strncpy( this->server_ip, server_ip, 20 ); + this->server_ip[19] = 0; + this->server_port = server_port; + strncpy( this->my_ip, my_ip, 20 ); + this->my_ip[19] = 0; + this->my_port = my_port; + //this->my_rtp_port = fill_random_rtp_port(); + this->my_rtp_port = 0; + if( debug_rtp ) debug_msg("new with rtp port %d ", this->my_rtp_port ); + + this->my_ext = my_ext; + itoa( this->my_ext, this->my_display, 10 ); + this->peer_ext = peer_ext; + + strcpy( this->fill_random_aux, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789pP" ); + strcpy( this->last_invite_tag, "" ); + strcpy( this->last_invite_callid, ""); + strcpy( this->SVNREV, "COLA" ); + status = sip_idle; + __init_sock__(); + muted = false; + + this->invite_pkg_sent = 0; + + call = NULL; + + ok_sent = 0; + waiting = false; + length_muted = 0; + listen_SIP_server_return = 0; + + sip_new_counter++; } +*/ Sip::Sip( int id, uint16_t my_port ){ FILE * fp = NULL; @@ -136,18 +175,15 @@ int Sip::registry(){ build_registry_package( buffer ); - int send = sock.sendTo( sip_server, buffer, strlen( buffer ) ); // > 400 - if( send != strlen( buffer ) ) - { - if( debug_reconnect ) send_msg("Reconnect SIP -- Registry"); - if( debug_reconnect ) send_msg("Sent %i of %i bytes", send, strlen( buffer ) ); - __reconnect__(); - miss_sip_registry_send_pkg++; + int sent = sock.sendTo( sip_server, buffer, strlen( buffer ) ); // > 400 + + if( debug_sip ) send_msg("Registry ( %d, %d ) - Sent %i of %i bytes", this->my_ext, this->my_port , sent, strlen( buffer ) ); + + if( sent != strlen( buffer ) ){ + sip_socket_send_failure++; } - - if( debug_sip ) send_msg("Registry ( %d, %d ) -- Sent %i of %i bytes", this->my_ext, this->my_port, send, strlen( buffer ) ); - return( send ); + return( sent ); } VZ_call * Sip::invite(){ @@ -165,21 +201,19 @@ this->invite_pkg_sent = 0; - do{ - this->invite_pkg_sent = sock.sendTo( sip_server, buffer, strlen( buffer ) ); - }while( this->invite_pkg_sent == 0 ); - - //FIXME verificar se posso nao usar invite_pkg_sent - int send = this->invite_pkg_sent; - if( send != strlen( buffer ) ) + if ( drop_invite_to_ast_pkg ) + { + debug_msg("Droped invite pkg to ast"); + } + else { - if( debug_reconnect ) send_msg("Reconnect SIP -- Invite"); - __reconnect__(); - miss_sip_invite_send_pkg++; + do{ + this->invite_pkg_sent = sock.sendTo( sip_server, buffer, strlen( buffer ) ); + }while( this->invite_pkg_sent == 0 ); + + if( debug_invite ) debug_msg("Return value for invite pkg %d", invite_pkg_sent ); } - if( debug_invite || debug_reconnect ) send_msg("Return value for invite pkg %d", invite_pkg_sent ); - invite_timer.stop(); invite_timer.reset(); invite_timer.start(); @@ -310,6 +344,10 @@ fill_random16h( branch ); fill_random( tag,18 ); fill_random16h( callid ); + + debug_msg("branch :: %s", branch ); + debug_msg("tag :: %s", tag ); + debug_msg("callid :: %s", callid ); strcpy( last_invite_tag,tag ); strcpy( last_invite_callid, callid ); @@ -335,7 +373,7 @@ strcat( header, "." ); itoa( 0, itoa_buffer, 10 ); strcat( header, itoa_buffer ); - strcat( header, "/UDP " ); + strcat( header, "/UDP " ); // isso que dizer qu eue sempre coloco /UDP:192, quando deveria ser /UDP<0x20>192... strcat( header, this->my_ip ); strcat( header, ":" ); itoa( this->my_port, itoa_buffer, 10 ); @@ -430,14 +468,37 @@ strcat( body, itoa_buffer ); strcat( body, "\r\n" ); + this->my_rtp_port = fill_random_rtp_port(); sprintf( itoa_buffer,"i=UDP %d\r\n", this->my_rtp_port ); strcat( body, itoa_buffer ); - strcat( body, "m=audio " ); itoa( this->my_rtp_port, itoa_buffer, 10 ); strcat( body, itoa_buffer ); - if( debug_rtp ) debug_msg("Invite PKG with rtp port ( %d - %s )", this->my_rtp_port, itoa_buffer ); + + if( debug_rtp ) debug_msg("Invite PKG with rtp poOort ( %d - %s )", this->my_rtp_port, itoa_buffer ); + + /* + if ( chicago ) + { + chicago = false; + itoa( ( this->my_rtp_port ) + 19, itoa_buffer, 10 ); + debug_msg("my_rtp_port( %d )", my_rtp_port + 19 ); + strcat( body, itoa_buffer ); + } + else + { + if ( canada ) + { + canada = false; + strcat( body, " " ); + } + else + { + strcat( body, itoa_buffer ); + } + } + */ strcat( body, " RTP/AVP " ); itoa( 8, itoa_buffer, 10 ); strcat( body, itoa_buffer ); @@ -872,11 +933,10 @@ return this->my_rtp_port; } int Sip::fill_random_rtp_port () -{ +{ static uint16_t port = 0; port += 2; port &= 0x7fe; // 0 to 2046, always even - return port + 16384; } @@ -930,30 +990,31 @@ } void Sip::send_bye( void ){ - int send = sock.sendTo( sip_server, build_bye_package( this->buffer ), strlen( this->buffer ) ); + + int ret = sock.sendTo( sip_server, build_bye_package( this->buffer ), strlen( this->buffer ) ); if( debug_sip ) send_msg( "sizeof( bye pkg ) :: %d", strlen( buffer ) ); - if( send != strlen( this->buffer ) ) - { - if( debug_reconnect ) send_msg("Reconnect SIP -- BYE, %d, %d", send, strlen( this->buffer ) ); - __reconnect__(); - miss_sip_bye_send_pkg++; + if( ret == -1 ){ + muted = true; + }else{ + muted = false; } } void Sip::send_unregistry_pkg(){ build_unregistry_package( this->buffer ); - int send = sock.sendTo( sip_server, build_bye_package( this->buffer ), strlen( this->buffer ) ); - if( send != strlen( this->buffer ) ) - { - if( debug_reconnect ) send_msg("Reconnect SIP -- Unregistry"); - __reconnect__(); - miss_sip_unregistry_send_pkg++; + int ret = 0; + + ret = sock.sendTo( sip_server, build_bye_package( this->buffer ), strlen( this->buffer ) ); + if( debug_sip ) send_msg("sizeof( unregistry_pkg ) :: %d", strlen( buffer ) ); + + if( ret == -1 ){ + muted = true; + }else{ + muted = false; } - - if( debug_sip ) send_msg("sizeof( unregistry_pkg ) :: %d", strlen( buffer ) ); } char * Sip::build_unregistry_package( char * buffer ){ @@ -1052,15 +1113,9 @@ int length = sock.receiveFrom( from, buffer, sizeof( buffer ) ); - //checa se o pacote foi recebido do antigo host conhecido. if( memcmp( ( ( u8_t * )( &(from._remoteHost) ) ) + 2, ( ( u8_t * )( &(sip_server._remoteHost) ) ) + 2, 6 ) != 0 ) return 0; - if( length == -1 ) - { - if( debug_reconnect ) send_msg("Reconnect SIP -- UDP Incomming"); - __reconnect__(); - miss_sip_inc_pkg++; - } + if( length == -1 ){ length_muted++; } if( length > 0 ){ if( sizeof( buffer ) > length ) buffer[ length ] = 0; @@ -1073,36 +1128,44 @@ } if( ( status == sip_trying ) || ( status == sip_ringing ) || ( status == sip_waiting_trying ) ){ - //if( !( strncasecmp( buffer + 7, " 200 ", 5 ) ) ){ - if( sip_response == 200 ){ // Ok + if( sip_response == 200 ){ // Ok char *ref = strstr( buffer, "audio" ); if( debug_invite ) debug_msg("ok"); if( ref != NULL ){ + if ( drop_ok_pkg ) + { + debug_msg("Droped ok pkg received from ast"); + return -71; + } + ref += 6; // audio ref = strtok( ref, " "); if( call == NULL ){ call = new VZ_call( this->my_ext, this->my_rtp_port, this->peer_ext, atoi( ref ) ); - if( debug_rtp ) debug_msg("Ok invite ( %d, %d, %d, %d ( %s ) ) ", this->my_ext, this->my_rtp_port, this->peer_ext, atoi( ref ), ref ); if( call == NULL ) memory_is_over = true; } char ans[ 1024 ]; build_ack_package( ans, ( unsigned char *)buffer ); - int send = sock.sendTo( sip_server, ans, strlen( ans ) ); - if( send != strlen( ans ) ) + if ( drop_ack_pkg ) { - if( debug_reconnect ) send_msg("Reconnect SIP -- Ok -- Call mode on"); - __reconnect__(); - miss_sip_ok_send_pkg++; + debug_msg("Droped ack pkt to ast"); + //return -73; + // nao faz sentido ter esse return por que na logica o resto eh processado + } + else + { + ok_sent = sock.sendTo( sip_server, ans, strlen( ans ) ); } + debug_msg("sizeof( ack ) :: %d - strlen( ans ):: %d", ok_sent, strlen( ans ) ); if( debug_invite ) debug_msg("Call alocada -- Sip::status::%d :: ", status ); set_status( status, sip_on_call ); } } } - if( ( status == sip_trying ) || ( status == sip_ringing ) ){ + if( ( status == sip_trying ) || ( status == sip_ringing ) ){ //if( !( strncmp( buffer + 7, " 4", 2 ) ) ){ if( sip_response >= 400 && sip_response < 700 ){ if( debug_invite ) { @@ -1121,7 +1184,6 @@ ref = strtok( ref, " "); if( call == NULL ){ this->call = new VZ_call( this->my_ext, this->my_rtp_port, this->peer_ext, atoi( ref ) ); - if( debug_rtp ) debug_msg("Session in Progress ( %d, %d, %d, %d ( %s ) ) ", this->my_ext, this->my_rtp_port, this->peer_ext, atoi( ref ), ref ); if( call == NULL ) memory_is_over = true; } waiting = true; @@ -1136,6 +1198,7 @@ } } if( status == sip_waiting_trying ){ + //if( !( strncasecmp( buffer + 7, " 100 ", 5 ) ) ){ if( sip_response == 100 ){ if( debug_invite ) debug_msg("trying") set_status( status, sip_trying ); @@ -1146,22 +1209,16 @@ char ans[ 2000 ]; build_reply_package( ans, (unsigned char*)buffer ); - int send = sock.sendTo( sip_server, ans, strlen( ans ) ); - if( send == strlen( ans ) ) - { - if( debug_reconnect ) send_msg("Reconnect SIP -- RCV BYE from *"); - __reconnect__(); - miss_sip_rcv_bye_send_pkg++; - } - - if( debug_invite ) debug_msg("sizeof( bye reply pkg ) :: %d\nServer request BYE to %d ext\nBye request received from *", strlen( ans ), my_ext ); - - set_sip_rtp_port( 0 ); + int bye_sent = sock.sendTo( sip_server, ans, strlen( ans ) ); + if( debug_invite ) debug_msg("sizeof( bye reply pkg ) :: %d", strlen( ans ) ); + if( debug_invite ) debug_msg("Server request BYE to %d ext", my_ext ); + if( debug_invite ) debug_msg("Bye request received from *"); listen_SIP_server_return = my_ext; } } } + return length; } @@ -1178,7 +1235,7 @@ void Sip::set_sip_rtp_port ( int new_my_rtp_port ) { this->my_rtp_port = new_my_rtp_port; - if( debug_rtp ) debug_msg( "this->my_rtp_port ( %d ) = new_my_rtp_port( %d )", this->my_rtp_port, new_my_rtp_port ); + debug_msg( "this->my_rtp_port ( %d ) = new_my_rtp_port( %d )", this->my_rtp_port, new_my_rtp_port ); } int Sip::print_yourself ( void )